微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 MainWindow 调用时,QGraphicsScene 未显示在 QDockWidget 的 QGraphicsView 中

如何解决从 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

解决方法

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

抱歉打扰了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。