【问题标题】:QMainWindow wont open in conditional blockQMainWindow 不会在条件块中打开
【发布时间】:2019-12-15 16:58:21
【问题描述】:

在打开一个QMainWindow之前发生了登录,有3种可能的结果,一个错误,一个老师和一个用户,如果登录结果是用户必须打开一个QMainWindow pro用户,如果他是老师他的QMainWindow。

    LoginDialog login;
    login.exec();

    switch(login.result()){

    case LoginResult::NONE:
        qDebug() << "None";
        break;

    case LoginResult::PROF:
        qDebug() << "Prof";
        break;

    case LoginResult::USER:
    {
        MainWindow w;
        w.show();
    }
        break;

    case LoginResult::ERROR:
        Database::Terminate();
        return -1;

    }

问题在于,在机箱内部,窗口仅打开不到一秒钟并自动关闭,在开关外部,窗口显示并保持应有的状态。

为什么会这样?

【问题讨论】:

  • MainWindow 对象立即超出范围。
  • 你在显示窗口后给app.exec()打电话了吗?
  • @MaxiMouse 在函数末尾return app.exec()

标签: c++ qt


【解决方案1】:

主窗口对象在块的末尾超出范围,并被销毁。您需要使用new 创建它以防止这种情况:

case LoginResult::USER:
{
    auto *w = new MainWindow;
    w->setAttribute(Qt::WA_DeleteOnClose); // to prevent memory leak
    w->show();
}

指针变量w 超出范围,但由于它是纯原始指针,因此不会删除实际对象。将对象设置为在关闭时自行删除是QWidget 功能,也是确保主窗口被彻底删除的一种方法。不确定它是否适合您的应用程序,但您可以从它开始,然后在需要时再做其他事情。

【讨论】:

  • 它工作了,但是为什么你需要创建一个不自动关闭的指针?
  • @IvesTI 您需要创建一个不会被破坏的 MainWindow 对象。局部变量在其作用域结束时被销毁。如果变量是对象,那么对象就会被销毁。如果您希望它在创建它的范围结束时不被销毁,则需要将其放入“免费存储”AKA“堆”(IOW 直接或间接使用new 创建它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多