更新:有一个新类称为QGraphicsSceneMouseEvent
这使得这变得更容易一些。
我刚刚在这里完成了一个使用它的示例:
https://stackoverflow.com/a/26903599/999943 https://stackoverflow.com/a/26903599/999943
它与下面的答案不同之处在于它子类化QGraphicsScene
, not QGraphicsView
,并且它使用mouseEvent->scenePos()
所以不需要手动映射坐标。
您走在正确的道路上,但还有一些路要走。
你需要子类化QGraphicsView
能够通过按下鼠标或释放鼠标来执行某些操作QMouseEvent
.
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>
class MyQGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyQGraphicsView(QWidget *parent = 0);
signals:
public slots:
void mousePressEvent(QMouseEvent * e);
// void mouseReleaseEvent(QMouseEvent * e);
// void mouseDoubleClickEvent(QMouseEvent * e);
// void mouseMoveEvent(QMouseEvent * e);
private:
QGraphicsScene * scene;
};
QGraphicsView
本身不具有无量纲点。您可能想要使用QGraphicsEllipse
项目或简单地说,scene->addEllipseItem()
具有非常小的半径。
#include "myqgraphicsview.h"
#include <QPointF>
MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
QGraphicsView(parent)
{
scene = new QGraphicsScene();
this->setSceneRect(50, 50, 350, 350);
this->setScene(scene);
}
void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
double rad = 1;
QPointF pt = mapToScene(e->pos());
scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,
QPen(), QBrush(Qt::SolidPattern));
}
注意使用mapToScene()
使pos()
事件映射正确到场景中鼠标单击的位置。
您需要添加子类的实例QGraphicsView
如果您要使用表单,请更改为 ui 的centralWidget 布局。
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
或者如果你的用户界面已经有布局,它将如下所示:
ui->centralWidget->layout()->addWidget( new MyGraphicsView() );
如果你不使用QMainWindow
和一个表单,您可以将其添加到QWidget
如果您为其设置布局然后添加您的QGraphicsView
以类似的方式调整到该布局。如果您不希望周围有边距QGraphicsView
,只需调用 show 即可,不要将其放在不同的布局中。
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
就是这样。现在你有危险了QGraphicsView
以及它们与鼠标的交互。
请务必阅读和研究 Qt 的相关内容图形视图框架 https://doc.qt.io/qt-5/graphicsview.html以及相关的examples https://doc.qt.io/qt-5/examples-graphicsview.html使用时要有效QGraphicsView
and QGraphicsScene
。它们是非常强大的 2D 图形工具,可能有一些学习曲线,但它们是值得的。