QGraphicsScene не отображается в QGraphicsView в QDockWidget при вызове из MainWindow

#c #qgraphicsview #qgraphicsscene #qdockwidget

#c #qgraphicsview #qgraphicsscene #qdockwidget

Вопрос:

У меня есть QGraphicsView в QDockWidget, в котором я показываю изображение в формате PNG. Если я создаю QPixMapItem в конструкторе dockwidget и вызываю функцию-член 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() в конструкторе и вызову его через сигнал из моего основного окна, то графика не отображается. Вот код в моем главном окне:

     IvConfDockWidget *icdw = new IvConfDockWidget;
    connect(this, amp;IView::updateZoomWindow, icdw, amp;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
 

Ответ №1:

Я понял это. В моем MainWindow используется гибридная модель данных drive / RAM, которая может находиться в разных состояниях, и случилось так, что в одном из состояний сигнал никогда не передавался. Как только я это исправил, поведение соответствует желаемому.

Извините за шум.