2014-09-02 32 views
0

我想使用QGraphicsLineItem繪製一條線。我想要的是,在點擊GraphicsView時,必須在第二次單擊Line之後繪製。我對QGraphicsLineItem的語法以及如何使用它感到困惑。我是Qt新手。請幫我解決這個問題。使用QGraphicsLineItem在當前位置繪製線

+1

請顯示您的密碼。確保它很短 - 將它們放到一個main.cpp文件中。 – 2014-09-02 13:03:42

回答

0

可以導出圖形視圖/場景並重寫mousePressEvent

下面是例如使用衍生QGraphicsScene和重寫mousePressEvent

類定義:

class MyScene : public QGraphicsScene 

數據成員:

QList<QPointF> m_clickPositions; 
int m_mode; 
編號:
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if(false == sceneRect().contains(event->scenePos())) 
    { 
     QGraphicsScene::mousePressEvent(event); 
    } 
    else if(Qt::LeftButton == event->button() && m_mode == ConstructMode) 
    { 
     m_clickPositions.append(event->scenePos()); 

     if(m_clickPositions.size() == 2) 
     { 
      QLineF lineF(m_clickPositions[0], m_clickPositions[1]); 
      QGraphicsLineItem* item = this->addLine(lineF); 
      m_clickPositions.clear(); 
      m_mode = ScrollMode; 
     } 

    } 
} 

我在項目中使用了類似的東西,並提取了代碼。希望這可以幫助。
請評論這是行不通的。

編輯::
ConstructMode和滾動模式用於上述程序,以便我可以區分是否要繪製/構造或只是滾動場景。如果你不需要,你可以刪除它們和m_mode的聲明。

如果你想使用模式,你可以定義一些公共常量並添加一個方法setMode()。請參閱下面的代碼。

MyScene.h或者如果你有一個

#define ConstructMode 100 
#define ScrollMode 101 

,並添加以下功能

void MyScene::setMode(int mode) 
{ 
    m_mode = mode; 
} 

在此之後,如果你想進入施工模式下,你將需要調用myScene一些常量文件 - > setMode(ConstructMode),因爲在項目構建之後,模式被重置爲ScrollMode。

+0

我用這個代碼,但得到如下:1)錯誤:'ConstructMode'未在此範圍內聲明 2)錯誤:'ScrollMode'未在此範圍內聲明 – user3859872 2014-09-02 17:46:41

+0

請幫助我。我沒有得到在何處以及如何聲明構造模式和Scrollmode – user3859872 2014-09-02 18:34:08

+0

ScrollMode和ConstructMode被我用來區分我是處於構造/繪製模式還是僅僅想滾動場景。如果你不需要它們,你可以刪除它們。 (也刪除m_mode聲明)。 – Pratham 2014-09-03 06:14:07

1

您可以使用此代碼段。

* H

#ifndef GRAPHICSSCENE_H 
#define GRAPHICSSCENE_H 

#include <QGraphicsScene> 
#include <QStack> 
#include <QPoint> 
#include <QMouseEvent> 
class GraphicsScene : public QGraphicsScene 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsScene(QObject *parent = 0); 

signals: 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); 
public slots: 
    private: 

    QStack<QPoint> stack; 

}; 

#endif // GRAPHICSSCENE_H 

*的.cpp

#include "graphicsscene.h" 
#include <QDebug> 
#include <QGraphicsSceneMouseEvent> 

GraphicsScene::GraphicsScene(QObject *parent) : 
    QGraphicsScene(parent) 
{ 
} 

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    qDebug() << "in"; 
    if (mouseEvent->button() == Qt::LeftButton) 
    { 
     QPoint pos = mouseEvent->scenePos().toPoint(); 


     if(stack.isEmpty()) 
      stack.append(pos); 
     else if(stack.count() == 1) 
     { 
      stack.append(pos); 
      addLine(QLine(stack.pop(),stack.pop()),QPen(Qt::green)); 
     } 
    } 
} 

用法:

GraphicsScene *scene = new GraphicsScene(this); 
ui->graphicsView->setScene(scene); 
ui->graphicsView->show(); 

編輯:更漂亮的解決方案,因爲你需要它的工作原理。

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    qDebug() << "in"; 
    if (mouseEvent->button() == Qt::LeftButton) 
    { 
     QPoint pos = mouseEvent->scenePos().toPoint(); 

     if(stack.isEmpty()) 
      stack.append(pos); 
     else 
      addLine(QLine(pos,stack.pop()),QPen(Qt::green)); 
    } 
} 
相關問題