【发布时间】:2018-05-13 16:45:57
【问题描述】:
我基于QGraphicsView 制作了一个小部件(QDataflowCanvas),我将信号QGraphicsScene::selectionChanged() 连接到我的主窗口的插槽MainWindow::onSelectionChanged:
void MainWindow::onSelectionChanged()
{
// canvas is ptr to QDataflowCanvas, subclass of QGraphicsView
auto selNodes = canvas->selectedNodes();
auto selConns = canvas->selectedConnections();
...
}
当我关闭我的MainWindow 并且在QGraphicsView 中选择了某些项目时,就会出现问题。
我认为我不需要提供完整的代码(虽然可以找到 here),因为我已经隔离了崩溃的原因。
这就是将要发生的事情(按因果顺序):
- MainWindow 的析构函数被调用
- QDataflowCanvas 的析构函数被调用
- QGraphicsView 的析构函数被调用
- QGraphicsScene 的析构函数被调用,触发删除所有项目(
clear()) - QGraphicsItem 的析构函数被调用
- 将触发 selectionChange 事件
- 调用 MainWindow::onSelectionChanged 槽
- 方法 QDataflowCanvas::selectedNodes() 被调用,但对象被销毁
- 崩溃!
可以从崩溃的堆栈跟踪中看到更详细的信息:
我找到了这个解决方法:如果我断开MainWindow::~MainWindow中的信号,它当然不会崩溃:
MainWindow::~MainWindow()
{
QObject::disconnect(canvas->scene(), &QGraphicsScene::selectionChanged, this, &MainWindow::onSelectionChanged);
}
但这似乎是一种相当不典型的做法:我从来没有发现自己必须手动严重的信号槽连接,否则程序会崩溃。
必须有更合适的解决方案。
【问题讨论】: