Qt:mainWindow-> show();不显示mainWindow

时间:2010-12-03 22:52:23

标签: c++ qt

在下面的代码中,我创建了一个窗口,调用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();
}

2 个答案:

答案 0 :(得分:4)

这正是发生的事情。

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

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

  

有必要调用此功能   开始事件处理。主要的   事件循环从中接收事件   窗口系统并将这些发送到   应用程序小部件。

     

通常,没有用户交互可以   在调用exec()之前发生。

答案 1 :(得分:0)

听起来像你想拥有一个多线程的应用程序。一个线程应该负责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执行一次性更新,以便用户(和操作系统)知道应用程序未挂起。