Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QGraphicsCenter上绘制点(在鼠标单击上)?_C++_Qt_Qgraphicsscene_Mouseclick Event - Fatal编程技术网

C++ 如何在QGraphicsCenter上绘制点(在鼠标单击上)?

C++ 如何在QGraphicsCenter上绘制点(在鼠标单击上)?,c++,qt,qgraphicsscene,mouseclick-event,C++,Qt,Qgraphicsscene,Mouseclick Event,我有以下代码来设置qgraphicscene。我希望单击场景并在我单击的位置绘制一个点。我怎么能这样做?这是我当前的代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QGraphicsScene *scene; QGraphicsView *view = new QGraphic

我有以下代码来设置
qgraphicscene
。我希望单击场景并在我单击的位置绘制一个点。我怎么能这样做?这是我当前的代码:

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
的新类,使这一过程变得更简单。 我刚刚在这里完成了一个使用它的示例:

它与下面的答案不同,因为它是
qgraphicscene
的子类,而不是
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;
    };
注意使用
maptosene()
使事件的
pos()
正确映射到在场景上单击鼠标的位置

如果要使用表单,则需要将子类
QGraphicsView
的实例添加到用户界面的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();
    }
#包括
#包括“myqgraphicsview.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
MyQGraphicsView视图;
view.show();
返回a.exec();
}
就这样。现在,使用
QGraphicsView
及其与鼠标的交互非常危险


在使用
QGraphicsView
qgraphicscene
时,一定要阅读和研究有关Qt的内容以及相关的有效方法。它们是非常强大的2D图形工具,可以有一点学习曲线,但它们是值得的。

phyatt,非常感谢“注意使用mapToScene()使事件的pos()正确映射到鼠标在场景上单击的位置。”
    #include <QtGui/QApplication>
    #include "myqgraphicsview.h"

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);

        MyQGraphicsView view;
        view.show();

        return a.exec();
    }