如何解决从 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 举报,一经查实,本站将立刻删除。