更新:有一个名为的新类QGraphicsSceneMouseEvent
使这更容易一些。我刚刚在这里完成了一个使用它的示例:
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
item 或简单地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 已经有布局,它将如下所示:
ui->centralWidget->layout()->addWidget( new MyGraphicsView() );
如果您不使用 aQMainWindow
和表单,则可以将其添加到 aQWidget
如果您为其设置布局,然后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
's 及其与鼠标的交互很危险。
请务必阅读和学习 Qt 的Graphics View Framework和相关示例,以便在使用QGraphicsView
和时有效QGraphicsScene
。它们是用于 2D 图形的非常强大的工具,可以有一点学习曲线,但它们是值得的。