我想使用QGraphicsLineItem绘制一条线。我想要的是,在点击GraphicsView时,必须在第二次单击Line之后绘制。我对QGraphicsLineItem的语法以及如何使用它感到困惑。我是Qt新手。请帮我解决这个问题。使用QGraphicsLineItem在当前位置绘制线
回答
可以导出图形视图/场景并重写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。
我用这个代码,但得到如下:1)错误:'ConstructMode'未在此范围内声明 2)错误:'ScrollMode'未在此范围内声明 – user3859872 2014-09-02 17:46:41
请帮助我。我没有得到在何处以及如何声明构造模式和Scrollmode – user3859872 2014-09-02 18:34:08
ScrollMode和ConstructMode被我用来区分我是处于构造/绘制模式还是仅仅想滚动场景。如果你不需要它们,你可以删除它们。 (也删除m_mode声明)。 – Pratham 2014-09-03 06:14:07
您可以使用此代码段。
* 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. 使用基于当前位置的MapKit在地图上绘制路线
- 2. 如何使用MyLocationOverlay在MapView上绘制当前GPS位置?
- 3. drawPolygon不断绘制从开始(mousePressed)位置到当前(mouseDragged)位置的线条
- 4. Gmaps - 当前位置移动多线制
- 5. Android GPS绘图仪从当前位置绘制线条直到停止移动
- 6. 在异步任务onPostExecution后在当前位置绘制标记
- 7. 当在相同的位置绘制球体和线条时,它们被绘制在不同的位置
- 8. 如何在Google Maps图像中绘制当前位置
- 9. 谷歌地图当前位置绘图
- 10. 如何绘制从当前位置到目的地的路线方向
- 11. 如何在地图视图中绘制从当前位置到目的位置的路线xamarin iOS
- 12. vis.js当前时间线:如何在vis.js中绘制线条
- 13. 如何分配当前地理坐标以绘制从当前位置到目标位置的路径?
- 14. 我使用此代码来查看用户当前位置。当前位置
- 15. 在iOS应用中绘制用户当前位置到目的地之间的路线方向?
- 16. 如何在iOS/Swift中根据当前位置给出方位/标题值来绘制线条?
- 17. 图中使用当前节点放置可以绘制networkx吗?
- 18. 使用CEF,bing地图在显示路线之前先显示当前位置
- 19. Android:如何使用GPS提供商离线当前位置?
- 20. 如何在java中使用绘制线绘制楼梯线?
- 21. 当前位置在Titanium VideoPlayer
- 22. 当前位置在java中
- 23. 使用CLLocationCoordinate2D获取当前位置
- 24. 使用cordovaGeolocation获取当前位置
- 25. 不使用gps的当前位置
- 26. 使用Winapi获取当前位置
- 27. 使用wifi获取当前位置?
- 28. 使用当前位置的大陆iPhone
- 29. 使sprite蹲在当前位置蟒蛇
- 30. Android:在特定位置绘制位图,拒绝绘制
请显示您的密码。确保它很短 - 将它们放到一个main.cpp文件中。 – 2014-09-02 13:03:42