使用QGraphicsLineItem在当前位置绘制线条

时间:2014-09-02 12:49:52

标签: qt

我想使用QGraphicsLineItem绘制一条线。我想要的是,在第二次单击Line之后单击GraphicsView时必须绘制。我对QGraphicsLineItem的语法以及如何使用它感到困惑。我是Qt的新手。请帮我解决这个问题。

2 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分: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和Scroll模式在上面的程序中使用,以便我可以区分是否要绘制/构造或只是滚动场景。如果不需要,您可以删除它们和m_mode的声明。

如果要使用这些模式,可以定义一些公共常量并添加方法setMode()。请参阅下面的代码。

MyScene.h或一些常量文件(如果你有一个

#define ConstructMode 100
#define ScrollMode 101

并添加以下功能

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

在此之后如果你想进入构造模式,你需要每次调用myScene-&gt; setMode(ConstructMode),因为在构造项目之后,模式被重置为ScrollMode。