我有以下代码来设置QGraphicsScene
。我希望单击场景并在单击的位置绘制一个点。我该怎么办?这是我当前的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene;
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(QRect(20, 50, 400, 400));
scene = new QGraphicsScene(50, 50, 350, 350);
view->setScene(scene);
}
最佳答案
更新:有一个名为QGraphicsSceneMouseEvent
的新类,使它更容易一些。
我刚刚在这里使用了一个示例:
https://stackoverflow.com/a/26903599/999943
它与下面的答案不同,因为它是QGraphicsScene
的子类,而不是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()
正确映射到在场景中单击鼠标的位置。如果要使用表单,则需要在ui的centralWidget布局中添加子类
QGraphicsView
的实例。 QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
或者如果您的ui已经具有布局,则它将如下所示:
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
及其与鼠标的交互会很危险。在使用
QGraphicsView
和QGraphicsScene
时,请务必阅读并研究Qt的Graphics View Framework和相关的examples才能有效。它们是用于2D图形的非常强大的工具,虽然有一些学习曲线,但值得这么做。关于c++ - 如何在QGraphicsScene上绘制一个点(单击鼠标)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7830054/