gpt4 book ai didi

c++ - 如何在 QGraphicsScene 上绘制一个点(通过鼠标单击)?

转载 作者:IT老高 更新时间:2023-10-28 22:17:38 26 4
gpt4 key购买 nike

我有以下代码来设置 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() 正确映射到鼠标在场景上单击的位置。

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

    QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );

或者如果你的用户界面已经有一个布局,它会看起来像这样:

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

一定要阅读和学习 Qt 的 Graphics View Framework和相关的examples在使用 QGraphicsViewQGraphicsScene 时有效。它们是用于 2D 图形的非常强大的工具,并且有一些学习曲线,但它们是值得的。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com