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