如何在QGraphicsScene上绘制一个点(点击鼠标)?

时间:2011-10-20 01:09:03

标签: c++ qt qgraphicsscene mouseclick-event

我有以下代码来设置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);
}

1 个答案:

答案 0 :(得分:32)

更新:有一个名为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()正确显示在场景中鼠标的位置。

如果要使用表单,则需要将子类QGraphicsView的实例添加到ui的centralWidget布局中。

    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以及它们与鼠标的交互很危险。

在使用QGraphicsViewQGraphicsScene时,请务必阅读并研究Qt的Graphics View Framework和相关的examples。它们是用于2D图形的非常强大的工具,可以有一点学习曲线,但它们是值得的。