我有以下代码来设置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及其与鼠标的交互会很危险。

在使用QGraphicsViewQGraphicsScene时,请务必阅读并研究Qt的Graphics View Framework和相关的examples才能有效。它们是用于2D图形的非常强大的工具,虽然有一些学习曲线,但值得这么做。

关于c++ - 如何在QGraphicsScene上绘制一个点(单击鼠标)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7830054/

10-13 07:24