【问题标题】:How to show dialog when main window became visible for the very first time in Qt widgets application?如何在 Qt 小部件应用程序中第一次看到主窗口时显示对话框?
【发布时间】:2015-12-18 08:59:14
【问题描述】:

我有 Qt 小部件应用程序,该应用程序必须先向用户授权 Web 服务请求,然后才能使用该程序。如果用户因任何原因无法登录,我必须退出应用程序。

.NET Framework为此实现了Load事件:当用户第一次看到窗口时(这里的关键字是“用户看到”),可以显示对话框;如果对话框结果不正确,我们在主应用程序窗口上调用 close。

使用 Qt,我们可以覆盖 showEvent。但是,它会在用户真正看到主窗口之前触发。当我在showEvent 中创建对话框时,它没有主窗口出现,当我在showEvent 中关闭主窗口时,它不会关闭(因为它目前没有打开)并且如果用户未能签名,则会出现稍后的事件在。它甚至在QApplication::quit() 呼叫之后出现。

我的问题是:有没有办法接收与 .NET Framework/Windows API 中完全相同的功能,并在用户真正看到窗口而不是“可能会看到某些东西或很快会看到”时触发事件?可以从showEvent 启动定时器来获得类似的效果,但我认为它不专业,因为你永远不知道用户计算机中可能发生什么(可能是它的 CPU 现在 100% 工作),你不能有真正保证计时器会在正确的时刻显示对话框。

【问题讨论】:

标签: c++ qt


【解决方案1】:

我会尝试创建 MainWindow 和 hide() 它是默认的。启动时唯一显示的小部件应该是登录对话框。我会将成功登录与 QMainWindow 的 show() 插槽和登录失败 - 与应用程序的退出插槽连接起来。

【讨论】:

  • 优点。只是不需要首先创建主窗口。您可以使用自定义插槽来创建它而不是显示。
【解决方案2】:

我通常在我的 main.cpp 中做这样的事情:

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    LoginDialog dialog;
    if(!dialog.exec()){
        return 1;
    }
    MainWindow w;
    w.show();
    return a.exec();
}

(当然)在将 LoginDialog 定义为从 QDialog 继承和将 MainWindow 定义为从 QMainWindow 继承之后。

【讨论】:

    【解决方案3】:

    在应用程序启动时创建主对话框,只有在服务积极响应时才创建主窗口。

    您实际上不需要深入研究事件处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多