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

Qt中如何管理另一个窗口?能否用exec()实现窗口驻留至用户关闭?

解决Qt弹出窗口快速消失的问题

嘿,这个问题我太熟了!你遇到的核心问题是局部窗口对象的生命周期:next()函数里的nextWin是局部变量,函数执行完毕后它就会被销毁,窗口自然就消失了。用QThread::sleep()只是强行延迟了函数结束的时间,根本不是合理的解决方案。

想要不用额外定义类和头文件,同时让新窗口像主窗口一样保持到用户主动关闭,最简单的办法就是用QDialog代替QMainWindow,因为QDialog自带exec()方法——和主函数里的a.exec()类似,它会启动一个局部事件循环,直到窗口关闭才会返回,完美解决生命周期问题。

修改后的代码

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QPushButton>
#include <QDialog>

void next() {
    QDialog nextWin;
    // 可根据需求设置窗口标题和大小
    nextWin.setWindowTitle("New Window");
    nextWin.setGeometry(400, 300, 200, 200);
    nextWin.exec(); // 启动模态事件循环,直到窗口关闭才返回
}

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QMainWindow mainWin;
    QPushButton *Start = new QPushButton;
    Start->setText("Start");
    mainWin.setCentralWidget(Start);
    mainWin.setGeometry(300,200,100,100);
    mainWin.show();
    QObject::connect(Start, &QPushButton::clicked, next);
    return a.exec();
}

为什么这样可行?

  • QDialog::exec()会启动一个独立的事件循环,阻塞当前函数的执行,直到用户关闭这个对话框。这期间局部变量nextWin不会被销毁,窗口能一直保持显示。
  • 这种方式是模态窗口,用户在关闭新窗口前无法操作主窗口,和你想要的“像主窗口一样保持显示直至用户主动关闭”的需求完全匹配。

如果非要用QMainWindow怎么办?

如果你坚持要用QMainWindow而不是QDialog,可以用动态分配的方式创建窗口,同时设置关闭时自动释放内存:

void next() {
    QMainWindow *nextWin = new QMainWindow;
    nextWin->setWindowTitle("New Main Window");
    nextWin->setGeometry(400, 300, 200, 200);
    nextWin->setAttribute(Qt::WA_DeleteOnClose); // 窗口关闭时自动销毁对象,避免内存泄漏
    nextWin->show();
}

不过这种方式是非模态窗口,主窗口依然可以操作,和exec()的模态行为不一样,你可以根据自己的需求选择。

内容的提问来源于stack exchange,提问作者Stan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:27