C++ 如果在消息框之后调用setOverrideCursor(Qt::WaitCursor),则setOverrideCursor(Qt::WaitCursor)不工作

C++ 如果在消息框之后调用setOverrideCursor(Qt::WaitCursor),则setOverrideCursor(Qt::WaitCursor)不工作,c++,qt,C++,Qt,当执行上述代码时,我希望在5秒内设置wait游标。但等待光标根本不出现。如果我移除开头的消息框,等待光标会出现并按预期停留5秒钟 这可能是什么原因?静态消息框方法使用exec,因此它停止执行当前代码。从QThread睡眠会阻塞整个主线程,这意味着没有更新,没有重新绘制,只是冻结GUI 解决方案: 不要使用静态消息框方法,在堆上创建新消息框并设置特殊标志以避免内存泄漏: QMessageBox::information(this, "hello", "hello"); QApplication::

当执行上述代码时,我希望在5秒内设置wait游标。但等待光标根本不出现。如果我移除开头的消息框,等待光标会出现并按预期停留5秒钟


这可能是什么原因?

静态消息框方法使用exec,因此它停止执行当前代码。从QThread睡眠会阻塞整个主线程,这意味着没有更新,没有重新绘制,只是冻结GUI

解决方案:

不要使用静态消息框方法,在堆上创建新消息框并设置特殊标志以避免内存泄漏:

QMessageBox::information(this, "hello", "hello");
QApplication::setOverrideCursor(Qt::WaitCursor);
QThread::sleep(5);
QApplication::restoreOverrideCursor();
不要使用QThread::sleep,使用QTimer中的singleshot,只需创建一些插槽,在其中还原光标:

QMessageBox *box = new QMessageBox;
box->setText(...);
//add info to box
box->setAttribute(Qt::WA_DeleteOnClose);
box->exec();

在这种情况下,所有操作都是异步的,GUI不会冻结。

QMessageBox::show不会阻塞。我需要阻止我的消息框,直到用户做出响应。@lahiruchanima主线程中的睡眠错误且不好,请使用singleShot,其次,是否需要模式消息框?然后设置box->setModaltrue;静态方法调用exec,但默认情况下exec调用模态对话框,所以您需要创建模态对话框,实际上我在实际代码中不使用睡眠。我正在做一些CPU密集型的工作。但是效果和睡觉一样,不是吗?顺便说一下,我用box->exec代替了box->show,现在出现了等待光标。有什么解释吗?@lahiruchanima首先,是的,我只是不知道这只是个例子。其次,exec应该阻止执行,当您关闭窗口时,它将开始使用重写游标执行代码。问题解决了吗?谢谢切尔诺贝利。我的问题现在已经解决了,但我不清楚它是如何解决的,因为正如您所说的,静态方法QMessageBox::information也在内部使用exec,就像非静态exec一样。
//override cursor
QTimer::singleShot(time,this,SLOT(slotWhichRestoresCursor()));