c++ - Qt - QGraphicsScene 和 QGraphicsView 没有更新更改?

标签 c++ qt qgraphicsview qgraphicsscene

我正在尝试一些看起来很容易的事情,但我有点挣扎。我希望能够在 GUI 中绘制矩形。我现在正在做的是:

  • 我使用 Qt Designer 创建了一个 GUI,其中包含一个 QGraphicsView。

  • 在我的主窗口中,我创建了一个 myGraphicsScene(派生自 QGraphicsScene 的类,但覆盖了鼠标按下、移动和释放事件),并将场景设置为在 UI 中创建的 QGraphicsView。

    <
  • 问题是当我改变场景时,我无法正确控制 View 的刷新和更新。

这是代码的相关部分:

MainGUIWindow 构造函数和初始化:

MainGUIWindow::MainGUIWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainGUIWindow)
{

    ui->setupUi(this);
    _init();
}

void MainGUIWindow::_init()
{

    scene = new myGraphicsScene(ui->frame_drawing);
    scene->setSceneRect(QRectF(QPointF(-100, 100), QSizeF(200, 200)));

    ui->graphicsView->setScene(scene);
    QRect rect(10, 20, 80, 60);
    scene->addText("Hello world!");
    scene->addRect(rect, QPen(Qt::black), QBrush(Qt::blue));
}

我可以完美地看到 HelloWorld 文本和这个矩形。但是,当我开始点击事件时,我无法再正确获取更新。

myGraphicsScene 类标题:

#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H

#include <QGraphicsScene>

class QGraphicsSceneMouseEvent;
class QPointF;
class QColor;

class myGraphicsScene : public QGraphicsScene
{
    Q_OBJECT

public:
    explicit myGraphicsScene(QObject *parent = 0);

public slots:

signals:

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) override;

private:
    QPen* pen;
    QBrush* brush;
    QRect* rect;
    QPoint* p1;
    QPoint* p2;

    bool firstClick;

    // bool startedRect;
};

#endif

myGraphicsScene 类实现:

#include "myGraphicsScene.h"

#include <QGraphicsSceneMouseEvent>
#include <QRect>

myGraphicsScene::myGraphicsScene(QObject *parent)
    : QGraphicsScene(parent)
{
    pen = new QPen(Qt::black);
    brush = new QBrush(Qt::blue);
    rect = 0;
    // startedRect = false;
    firstClick = true;
}


void myGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    if (mouseEvent->button() != Qt::LeftButton)
        return;


    // rect = new QRect((mouseEvent->scenePos()).toPoint(), (mouseEvent->scenePos()).toPoint());
    // addRect(*rect, *pen, *brush);
    // startedRect = true;

    if(firstClick)
    {
        p1 = new QPoint((mouseEvent->scenePos()).toPoint());
        QRect tmp_rect(*p1, *p1);
        addRect(tmp_rect, *pen, *brush);
    }
    else
    {
        p2 = new QPoint((mouseEvent->scenePos()).toPoint());
        QRect tmp_rect(*p2, *p2);
        addRect(tmp_rect, *pen, *brush);
    }
    QGraphicsScene::mousePressEvent(mouseEvent);
}

void myGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    // if(startedRect)
    // {
    //     rect->moveBottomRight((mouseEvent->scenePos()).toPoint());
    //     qDebug("Mouse Position: %d, %d", (mouseEvent->scenePos()).toPoint().x(), (mouseEvent->scenePos()).toPoint().y());
    //     qDebug("Rectangle BottomRight Position: %d, %d", rect->bottomRight().x(), rect->bottomRight().y());
    // }
    QGraphicsScene::mouseMoveEvent(mouseEvent);
}

void myGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{

    if (mouseEvent->button() != Qt::LeftButton)
        return;
    // rect = 0;
    // startedRect = false;
    if(firstClick)
    {
        firstClick = false;
    }
    else
    {
        rect = new QRect(*p1, *p2);
        addRect(*rect, *pen, *brush);
        p1 = 0;
        p2 = 0;
        rect = 0;
        firstClick = true;
    }
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}

我最初的想法是以拖放方式绘制矩形,但最终尝试了两次单击的方法,这种方法效果更好一些,但仍然没有完全更新 View 。

我是Qt的新手,所以我不是很熟悉应该怎么做。任何帮助将不胜感激,因为我现在已经被困在这里一段时间了。

谢谢!

最佳答案

在每个 mouse*Event() 重载中,调用 QGraphicsScene::update() 方法。它将安排在 View 上重绘。

http://doc.qt.io/qt-5/qgraphicsscene.html#update

关于c++ - Qt - QGraphicsScene 和 QGraphicsView 没有更新更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43064553/

相关文章:

c++ - 安装了 Cuda 8,它似乎缺少 npp.lib

c++ - 如何从 std vector 前面读取并删除读取变量?

c++ - 创建 QGenericArgument

c++ - 退出前等待插槽执行

qt - 从场景中删除QGraphicsProxyWidget后崩溃

qt - 在 QGraphicsView 上绘制小部件(例如按钮)

C++ getter/setter 范式

c++ - 我可以使用 applicationDirPath() 访问更高目录级别的资源吗?

c++ - QPen setCosmetic 在高 QGraphicsView 比例下不起作用

c++ - 在 QWidget 内的 QGraphicsScene 内绘制