Qt开发:用户关闭某窗口时如何触发另一关联窗口自动关闭
Qt关闭w1同步关闭w2实现方案
问题根因
原有代码无法生效的核心原因是:
QObject::destroyed信号仅在对象析构时才会触发,而QWidget默认关闭行为仅隐藏窗口,不会销毁对象,因此该信号不会被发射- 即便强制设置窗口关闭即销毁的属性,原有代码中栈上分配的w1对象会在关闭时触发二次析构,直接导致程序崩溃
跨库场景最优实现
该方案无需两个库互相依赖,仅需对w1所属类做最小改造:
- 在w1所在库中自定义QWidget子类,重写closeEvent并新增关闭信号
- 在连接信号槽的位置,将w1的自定义关闭信号与w2的close槽绑定即可
完整可运行代码示例:
#include <QApplication> #include <QtWidgets> // 该类仅需在w1所属库内部实现,对外无需暴露内部逻辑 class CustomW1 : public QWidget { Q_OBJECT Q_SIGNALS: // 自定义窗口关闭信号 void windowClosed(); protected: void closeEvent(QCloseEvent *event) override { // 先执行父类默认关闭逻辑 QWidget::closeEvent(event); // 确认关闭事件被接受后发射信号 if (event->isAccepted()) { emit windowClosed(); } } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); CustomW1 w1; w1.setWindowTitle("w1"); w1.show(); QWidget w2; w2.setWindowTitle("w2"); w2.show(); // 跨库场景下只要能拿到两个对象的指针即可完成绑定,无需互相依赖头文件 QObject::connect(&w1, &CustomW1::windowClosed, &w2, &QWidget::close); return a.exec(); }
替代方案(仅适用堆分配w1的场景)
如果不想自定义信号,且w1是通过new分配的堆对象,可以给w1设置Qt::WA_DeleteOnClose属性,关闭时会自动销毁w1触发destroyed信号,原有连接逻辑即可生效:
// 注意w1必须是堆分配,不能是栈变量 QWidget* w1 = new QWidget; w1->setAttribute(Qt::WA_DeleteOnClose); w1->setWindowTitle("w1"); w1->show(); QWidget* w2 = new QWidget; w2->setWindowTitle("w2"); w2->show(); // 原有连接逻辑可保留 QObject::connect(w1, &QObject::destroyed, w2, &QWidget::close);
内容的提问来源于stack exchange,提问作者sofname
相关产品推荐
相关产品推荐

