You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt开发:用户关闭某窗口时如何触发另一关联窗口自动关闭

Qt关闭w1同步关闭w2实现方案

问题根因

原有代码无法生效的核心原因是:

  • QObject::destroyed信号仅在对象析构时才会触发,而QWidget默认关闭行为仅隐藏窗口,不会销毁对象,因此该信号不会被发射
  • 即便强制设置窗口关闭即销毁的属性,原有代码中栈上分配的w1对象会在关闭时触发二次析构,直接导致程序崩溃

跨库场景最优实现

该方案无需两个库互相依赖,仅需对w1所属类做最小改造:

  1. 在w1所在库中自定义QWidget子类,重写closeEvent并新增关闭信号
  2. 在连接信号槽的位置,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:04