• 7491阅读
  • 0回复

[原创]Button的Disable与Enable功能 [复制链接]

上一主题 下一主题
离线小鸟一只
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-19
这是接触Qt以来写的第一篇帖子,主要是关于Qt中的Button的Disable与Enable的功能。其实这个功能也蛮简单的,但是有的地方还是需要注意的。由于项目需要,接触到Button的Disable与Enable功能。背景是,由于某件事情的处理时间比较出,而如果在处理这件事的过程中点击某些按钮的话,则会带来巨大灾难,甚至是程序的崩溃。故需要在处理这件事的过程中将这些按钮Disable掉,等事件处理完后在Enable这些按钮。此为背景,割了楼主啰嗦的舌头。以下是我找到解决方案的过程,
1.当然是去Qt Assistant中去找方法了,通过查询QPushButton类中所有可用的函数,终于找到下面两个函数,
setDisabled(bool):当传入的参数为true时,设置Button为Disabled的状态;否则设置为Enabled状态。
setEnabled(bool):则相反,当传入的参数为true时,设置Button为Enabled的状态。
Dialog的初始化中加入以下代码,
    m_listNextBtn->setEnabled(false);
m_listRefreshBtn->setEnabled(false);
将Button默认设置为Disabled状态,由于下面的事件执行完后Button自动会被设为Enabled状态,且下面的事件在Dialog初始化过程中会被执行。

在响应按钮消息的函数中添加以下代码,
m_listRefreshBtn->setEnabled(false);
m_listNextBtn->setEnabled(false);

  devList = dev.getAllDevices();
updateTreeWidget(devList);
其中updateTreeWidget(devList)中最后会将Button设置为Enabled状态。

意思是在先将Button设置为Disabled状态,然后等dev.getAllDevices()与updateTreeWidget(devList)两个函数执行完后,在将Button重新置回Enabled状态。此时心中甚喜,以为大功告成。结果自己运行的时候,发现,开始的时候Button确实为Disabled的状态,但是点击Button过后,Button还一直为Enabled状态,重来没有变成Disabled过。查看代码也没有发现什么问题,但是想想Dialog初始化的过程中都能设置Button状态成功过,说明setEnabled(false)这个函数是有效的。而且devList = dev.getAllDevices();updateTreeWidget(devList);这两个函数被执行了,说明也响应了按钮的点击消息。
2.将响应按钮消息的函数中的devList = dev.getAllDevices();updateTreeWidget(devList);两句函数注释掉,然后重新运行,发现点击按钮后Button变成了Disabled,看来问题确实是出现在这两句代码中。思来想去,只有updateTreeWidget(devList)中有将Button设置为Enabled代码,莫非是这两句代码引起的?果断去验证下
3.将上一步中注释掉的两句函数撤销注释,然后将updateTreeWidget(devList)中的设置Button为Enabled代码注释掉,在运行一遍,发现还是没有达到自己想要的效果,Button并没有在点击按钮后马上变成Disabled的状态,而是过一段时间才变成Disabled状态。看来updateTreeWidget(devList)中设置Button为Enabled代码对Button设置为Disabled状态确实有影响,但是并不是全受它们影响。仔细看看发现Button重Enabled状态到Disabled状态的等待时间刚好是devList = dev.getAllDevices();updateTreeWidget(devList);这两句话的时间。故猜想设置Button状态的函数setEnabled(bool)不是马上生效的,而是应该等待后面的函数全不执行完后才生效。
4.然后去接疯狂的查资料,最后在Qt Demo中发现一个有这个功能的Example(screenshot),找到相关的地方,发现是使用QTimer来实现的,自己就照着依葫芦画瓢,首先添加一个槽函数enableButtons(),在这个槽函数中实现devList = dev.getAllDevices();updateTreeWidget(devList);这两个功能,将响应按钮消息的函数中的这两句代码去掉,用下面的代码替换,
QTimer::singleShot(1000,this,SLOT(enableButtons()));这句话的意思是,在1s后执行enableButtons()这个槽函数。运行后发现真的能实现自己的功能。哈哈,好开心啊。

快速回复
限100 字节
 
上一个 下一个