zoukankan      html  css  js  c++  java
  • 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可能是一个图像处理算法,需要几秒钟来得到需要结果,然后再显示在程序中。

  • 相关阅读:
    数组
    字符对象的方法
    事件
    判断数据类型
    数据类型和变量
    语法
    快速入门
    JavaScript简介
    Spring init-method和destroy-method属性的使用
    spring3后提供了的context:property-placeholder/元素
  • 原文地址:https://www.cnblogs.com/kohlrabi/p/7117693.html
Copyright © 2011-2022 走看看