c++ - 从 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 数据模型,并且碰巧在其中一种状态下从未发出信号。一旦我解决了这个问题,行为就会如愿以偿。
对不起,噪音。
推荐阅读
- nginx - 如何将 nginx 配置转换为入口 kubernetes yaml 配置?
- excel - 在 VBA 中使用 Vlookup 和 IsNA 函数时出现运行时错误 438
- tornado - 在龙卷风中使用@run_on_executor 时,错误是线程'ThreadPoolExecutor-0_0'中没有当前事件循环
- r - 将每一行与其他行连接起来
- python - 如何使用 python 脚本编辑 xml 属性值
- javascript - KeyboardEvent 打字稿的索引签名
- vue.js - 带有 API/props 的完整日历集 dayNames
- scala - TheAfterWord 在 { 之后不带参数
- python-2.7 - BatchWriteItem 操作:提供的关键元素与架构不匹配
- numpy - 如何修复 AttributeError:我的 CNN 的“NoneType”对象没有属性“original_name_scope”?