- 在exec或show一个QWidget(及其子类)时,如果构造函数中需要做的工作需要消耗较多时间,会导致用户启动程序后,很长时间看不到界面的弹出。特别是如果这个消耗时间很长的工作并不影响程序的UI,而让用户去等待较长的时间显然是不合适的。
- 一个带UI的程序,如果在构造时需要用到UI的一些geo相关参数(如size),可能会出现显示问题。因为在构造动作结束之前,UI是不显示的。而UI不显示,geo相关参数是默认值,并不是Ui设计师或构造函数里设置的值。
以上两个问题,可以使用QTimer::singleShot(time, receiver, slot)来解决。这个函数将使得slot函数在time毫秒后被调用。为了避免上述两个问题,可以如下编写构造函数:
假设构造函数为myClass
,消耗时间较长的代码放在函数longTime
中,需要UI参数的代码放在needUI
中;
myClass::myClass()
{
// 其他必要操作
...
QTimer::singleShot(0, this, needUI());
}
myClass::needUI()
{
// 构造函数已经结束,可以正确获得geo相关参数
...
QTimer::singleShot(0, this, longTime())
}
myClass::longTime()
{
// 这里放置需要较长时间执行代码,如IO相关内容
}
例如,假设myClass
是个图片处理工具。构造函数中做必要设置,结束后程序立即显示,即使图片还没有加载;在needUI
函数中就可以成功获取程序的size
,然后将图片以合适的大小显示在程序中;最后longTime
可能是一个图像处理算法,需要几秒钟来得到需要结果,然后再显示在程序中。