2010-12-03 43 views
2

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

#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(); 
} 

回答

4

这就是发生了什么事情。从技术上讲,QMainWindow :: show()不会使窗口可见,它只是在窗口中设置一个标志,并且Qt会使它在事件循环的下一次迭代中可见。

而且,直接从Qt的对文档的QApplication :: EXEC():

有必要调用这个函数 启动事件处理。主要的 事件循环接收来自 窗口系统的事件,并将这些事件分派给 应用程序小部件。

通常,在调用exec()之前,不会发生用户交互 。

+0

好的,但我想在哪里执行我的功能? – dfetter88 2010-12-03 23:07:50

0

听起来像你想要一个多线程应用程序。一个线程应该负责UI,另一个线程将解决多维数据集并将更新发布到UI线程以显示进度。您可以使用信号和插槽来使Cube对象和mainWindow对象进行通信,以解决跨线程通信问题(请参阅http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/)。否则,如果您将两个操作放在同一个线程中,UI将“挂起”,因为主线程将无法处理UI事件(包括您在问题中特别提到的显示事件) 。

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