在下面的代码中,我创建了一个窗口,调用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();
}发布于 2010-12-04 07:01:30
这正是正在发生的事情。
从技术上讲,QMainWindow::show()不会使窗口可见,它只是在窗口中设置一个标志,而Qt将使其在事件循环的下一次迭代中可见。
另外,直接从Qt文档中获取QApplication::exec():
需要调用此函数来启动事件处理。主事件循环从窗口系统接收事件,并将这些事件分派到应用程序小部件。
通常,在调用exec()之前不能进行任何用户交互。
发布于 2014-03-17 19:06:03
在我看来,你想要一个多线程的应用程序。一个线程负责UI,另一个线程将求解立方体,并将更新发布到UI线程以显示进度。可以使用信号和槽使多维数据集对象和mainWindow对象进行通信,以解决线程间的通信问题(请参见http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/)。
否则,如果将这两个操作放在同一个线程上,UI将“挂起”,因为主线程将无法处理UI事件(包括您在问题中特别提到的show事件)。
如果这有点过分,您可以通过调用QApplication:: process (...)来指示应用程序显式地处理UI事件。在任何长时间运行的同步操作之前(并且最好是在期间)。这将对UI执行一次更新,以便用户(和操作系统)知道应用程序未挂起。
https://stackoverflow.com/questions/4350624
复制相似问题