项目场景:
需要将一个弹窗提升至最前面,那么弹出时直接使用raise()即可。
问题描述:
使用QDialog::raise()时,偶发界面阻塞卡死现象。
原因分析:
QDialog::raise()函数是置于顶部的作用,但是如果使用不当,会导致界面线程卡死(弹窗是在界面线程弹出的),因为QDialog::raise()会阻塞当前线程,直到对话框置于顶部。
解决方案:
异步调用QDialog::raise(),通过QTimer::singleShot()实现。
QTimer::singleShot()是在主线程的的循环中调用的,因此使用它并不会阻塞主线程。
用法示例:
QDialog* dialog = new QDialog();
dialog->show();
QTimer::singleShot(0, dialog, &QDialog::raise);
或者:
QDialog* dialog = new QDialog();
QTimer::singleShot(1, dialog, &QDialog::raise);
dialog->show();