QTimer.singleShot与QWidget初始化

  1. 在exec或show一个QWidget(及其子类)时,如果构造函数中需要做的工作需要消耗较多时间,会导致用户启动程序后,很长时间看不到界面的弹出。特别是如果这个消耗时间很长的工作并不影响程序的UI,而让用户去等待较长的时间显然是不合适的。
  2. 一个带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可能是一个图像处理算法,需要几秒钟来得到需要结果,然后再显示在程序中。

posted @ 2017-07-04 17:32  Droplet  阅读(758)  评论(0编辑  收藏  举报