2014-09-02 347 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)); 
    } 
} 
相关问题