首页 > 解决方案 > 从 MainWindow 调用时,QGraphicsScene 未显示在 QDockWidget 的 QGraphicsView 中

问题描述

我在 QDockWidget 中有一个 QGraphicsView,我在其中显示 PNG 图像。如果我在dockwidget 的构造函数中创建一个QPixMapItem,并从构造函数中调用dockwidget 的成员函数(一个公共槽)来显示图像,它就可以正常工作。

但是,如果我通过信号从 MainWindow(称为“IView”的类)调用插槽,则图像不会显示。我究竟做错了什么?

Dockwidget 构造函数:

IvConfDockWidget::IvConfDockWidget(IView *parent) :
    QDockWidget(parent),
    ui(new Ui::IvConfDockWidget)
{
    ui->setupUi(this);

    MyGraphicsView *zoomGraphicsView = new MyGraphicsView();
    MyGraphicsScene *zoomScene = new MyGraphicsScene();

    ui->zoomLayout->addWidget(zoomGraphicsView);

    QPixmap zoomPixmap = QPixmap("/home/mischa/logo.png");
    QGraphicsPixmapItem *zoomPixmapItem = new QGraphicsPixmapItem(zoomPixmap);

    updateZoomWindowReceived(zoomPixmapItem);       // does not work if called from MainWindow
}

这是公共插槽:

void IvConfDockWidget::updateZoomWindowReceived(QGraphicsPixmapItem *zoomPixmapItem)
{
    zoomGraphicsView->resetMatrix();
    zoomScene->clear();
    zoomScene->addItem(zoomPixmapItem);
    zoomGraphicsView->setScene(zoomScene);
    zoomGraphicsView->show();
}

如果我在构造函数中注释掉updateZoomWindowReceived(),并通过来自 MainWindow 的信号调用它,则图形不会显示。这是我的 MainWindow 中的代码:

    IvConfDockWidget *icdw = new IvConfDockWidget;
    connect(this, &IView::updateZoomWindow, icdw, &IvConfDockWidget::updateZoomWindowReceived);
    QPixmap zoomPixmap = QPixmap("/home/mischa/logo.png");
    icdw->zoomGraphicsView->resetMatrix();
    QGraphicsPixmapItem *newItem = new QGraphicsPixmapItem(zoomPixmap);
    emit updateZoomWindow(newItem);

为了完整起见,我的 QGraphicsView 和 QGraphicsScene 派生版本:

#define MYGRAPHICSVIEW_H

#include <QGraphicsView>
#include <QDebug>
#include <QMouseEvent>
#include <QScrollBar>

class MyGraphicsView : public QGraphicsView
{
    Q_OBJECT

private:
    QPointF rightDragStartPos;
    QPointF rightDragCurrentPos;
    QPointF rightDragEndPos;
    QPointF leftDragStartPos;
    QPointF leftDragCurrentPos;
    QPointF leftDragEndPos;        // unused
    QPointF middleDragStartPos;
    QPointF middleDragCurrentPos;
    QPointF middleDragEndPos;
    bool rightButtonPressed = false;
    bool leftButtonPressed = false;
    bool middleButtonPressed = false;
    QPoint previousMousePoint;

    bool _pan = false;
    int _panStartX = 0;
    int _panStartY = 0;

public:
    explicit MyGraphicsView();
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    QScrollBar *sxbar = nullptr;
    QScrollBar *sybar = nullptr;
    QString middleMouseMode = "DragMode";

    int x = 0;
    int y = 0;

signals:
    void currentMousePos(QPointF);
    void rightDragTravelled(QPointF);
    void middleDragTravelled(QPointF pointStart, QPointF pointEnd);
    void middleWCSTravelled(QPointF pointStart, QPointF pointEnd);
    void middleWCSreleased();
    void leftDragTravelled(QPointF pointStart, QPointF pointEnd);
    void rightPress();
    void leftPress(QPointF pointStart);
    void middlePress(QPointF point);
    void leftButtonReleased();
    void rightButtonReleased();
    void middleButtonReleased();
    void middlePressResetCRPIX();

public slots:
    void updateMiddleMouseMode(QString mode);
};

#endif // MYGRAPHICSVIEW_H

#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H

#include <QObject>
#include <QGraphicsScene>
#include <QKeyEvent>

class MyGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    MyGraphicsScene();

signals:
    void itemDeleted();

protected:
    void keyReleaseEvent(QKeyEvent * keyEvent);
};

#endif // MYGRAPHICSSCENE_H

标签: c++qgraphicsviewqgraphicssceneqdockwidget

解决方案


我想到了。我的 MainWindow 使用可以处于不同状态的混合驱动器/RAM 数据模型,并且碰巧在其中一种状态下从未发出信号。一旦我解决了这个问题,行为就会如愿以偿。

对不起,噪音。


推荐阅读