【问题标题】:Qt: mainWindow->show(); does not show the mainWindowQt:主窗口->显示();不显示主窗口
【发布时间】:2010-12-03 22:52:22
【问题描述】:

在下面的代码中,我创建了一个窗口,调用window.show(),但直到调用window->iterateSolution() 之后,该窗口才会显示。几乎就像,app.exec() 是显示窗口的函数。我对 Qt 很陌生,所以我不知道发生了什么。

#include <QtGui/QApplication>
#include <mainWindow.h>
#include <Cube.h>

mainWindow * newWindow;

int main(int argc, char *argv[]) {
    // initialize resources, if needed
    // Q_INIT_RESOURCE(resfile);

    QApplication app(argc, argv);
    newWindow = new mainWindow;
    newWindow->show();

    QString initialState = "YWOBYYBYYGRRGRRBWWYOOYGGRGGBBGYOOYOOWRRBBRBBWGOOGWWRWW";

    /* Construct cube, set state, and solve */
    Cube * cube = new Cube(initialState);
    QString solution = cube->solve();
    delete cube;
    newWindow->iterateSolution(solution);

    // create and show your widgets here

    return app.exec();
}

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    这正是正在发生的事情。

    从技术上讲,QMainWindow::show() 不会使窗口可见,它只是在窗口中设置一个标志,Qt 会在事件循环的下一次迭代中使其可见。

    另外,直接来自 Qt 关于 QApplication::exec() 的文档:

    需要调用这个函数 开始事件处理。主要的 事件循环从 窗口系统并将这些发送到 应用程序小部件。

    一般来说,没有用户交互可以 在调用 exec() 之前发生。

    【讨论】:

    • 好的,但是我想在哪里执行我的函数?
    • 将 mainWindow->show() 到 app.exec() 之间的代码放在 mainWindow 的“运行”槽中并使用 QTimer::singleShot(0, mainWindow, SLOT(run()))使其从事件循环中执行。
    • 通常你也可以在还不可见的小部件变得可见之前对其进行操作。
    【解决方案2】:

    听起来你想要一个多线程应用程序。一个线程应该负责 UI,另一个线程将解决多维数据集并将更新发布到 UI 线程以显示进度。您可以使 Cube 对象和 mainWindow 对象使用信号和槽进行通信,以解决跨线程通信问题(请参阅http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/)。

    否则,如果您将两个操作放在同一个线程上,UI 将“挂起”,因为主线程将无法处理 UI 事件(包括您在问题中特别提到的 show 事件)。

    如果这太过分了,您可以通过在任何长时间运行的同步操作之前(最好是期间)调用 QApplication::process(...) 来指示应用程序显式处理 UI 事件。这将对 UI 执行一次性更新,以便用户(和操作系统)知道应用程序没有挂起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      相关资源
      最近更新 更多