如何定位Qt中触发visibilityChanged信号的代码行
如何定位QDockWidget可见性被意外修改的代码位置?
示例代码
connect(dockObject, &QDockWidget::visibilityChanged, [=](bool visible) { qDebug() << "Visibility:" << visible; }); dockObject->setVisible(false); // this line changed visibility so the visibilityChanged signal was emitted
终端输出
Visibility: false
Visibility: true
问题
我的问题是:Visibility: true表明dockObject的可见性在某个未知位置被修改了,我想知道是哪一行代码触发的,是否可行?
当然可行,给你几个直接的排查方法:
利用Qt Creator的信号断点溯源
在Qt Creator中找到QDockWidget::visibilityChanged信号的定义(可以直接点击代码里的信号名跳转,或者通过Qt助手查找),在信号声明处打上断点。当信号触发时,调试器的调用栈会清晰显示触发信号的调用路径,顺着栈帧就能定位到修改可见性的代码行。重写setVisible方法加调用栈日志
自定义一个继承自QDockWidget的类,重写setVisible方法并添加调用栈打印:
class MyDockWidget : public QDockWidget { Q_OBJECT public: explicit MyDockWidget(QWidget *parent = nullptr) : QDockWidget(parent) {} void setVisible(bool visible) override { qDebug() << "setVisible triggered, call stack:"; // Qt 5.14及以上版本可直接打印调用栈 qDebug().noquote() << QMessageLogger().stackTrace(); QDockWidget::setVisible(visible); } };
将原代码中的QDockWidget替换为这个自定义类,运行后就能看到每次修改可见性的完整调用路径,直接定位到触发代码。
- 全局搜索相关调用
在Qt Creator中全局搜索项目里所有调用setVisible、show()、hide()、setHidden()的代码,重点排查针对dockObject或其父容器的操作——父控件的可见性变化也可能触发子控件的visibilityChanged信号。另外还要检查是否有调用QMainWindow::restoreState()这类恢复窗口状态的代码,这类操作也可能自动修改dock的可见性。
内容的提问来源于stack exchange,提问作者nnzzll
相关产品推荐
相关产品推荐

