在下面的代码中,我创建了一个窗口,调用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();
}
答案 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执行一次性更新,以便用户(和操作系统)知道应用程序未挂起。