• 7647阅读
  • 3回复

[提问]Qt中disable Button [复制链接]

上一主题 下一主题
离线小鸟一只
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-19
在Qt中想做到点击Button后,Disable这个Button,直到某件事完成后再Enable这个Button。则在响应点击Button的消息的函数中调用setDisabled(true)这个函数,但是结果却没有效果,Button还是处于Enabled状态。setEnabled(false)这个函数也试过了,同样是没有任何效果。具体见如下代码,
void listInforDlg::on_m_listRefreshBtn_clicked()
{
        qDebug()<<"clicked 'Refresh' button in the scan list page";
        
        qDebug()<<"Disabled 'Refresh' button";
        m_listRefreshBtn->setDisabled(true);
}

但是一开始的时候,这个Button是Disabled(通过Qt Designer设置的),后然通过调用setEnabled(true)函数把状态改过来了,然后就遇到了上面的情况。

这个是怎么回事?多谢!
离线小鸟一只
只看该作者 1楼 发表于: 2013-03-19
不好意思,纠正一点,如上面的代码是可以做到的。但是在上面的代码添加如下代码就不可以了,
    devList = dev.getAllDevices();
    updateTreeWidget(devList);
    m_listRefreshBtn->setEnable(true);
离线小鸟一只
只看该作者 2楼 发表于: 2013-03-19
貌似m_listRefreshBtn->setDisabled(true)与m_listRefreshBtn->setEnabled(false)不会立即生效,需要等到其后的所有函数都执行完后才会生效啊。
离线小鸟一只
只看该作者 3楼 发表于: 2013-03-19
哈哈,这个问题解决了,是在Qt Example中找到了一个例子(screenShot),先声明一个槽函数,在槽函数中完成你所要执行的事件,在调用m_listRefreshBtn->setDisabled(true)后不马上执行你所要执行的动作,而是建立一个信号与槽的连接,QTimer::singleShot(1000,this,SLOT(enableButtons()));意思是在1s后执行槽函数enableButtons。所以以上代码将会被修改成了下面的代码,
void listInforDlg::on_m_listRefreshBtn_clicked()
{
    qDebug()<<"clicked 'Refresh' button in the scan list page";

    qDebug()<<"Disabled 'Refresh' button.";
    m_listRefreshBtn->setEnabled(false);

    qDebug()<<"Disabled 'Next' button";
    m_listNextBtn->setEnabled(false);

    QTimer::singleShot(1000,this,SLOT(enableButtons()));
}


void listInforDlg::enableButtons()
{
      devList = dev.getAllDevices();
      updateTreeWidget(devList);
}

最后在updateTreeWidget(devList)中最后调用
m_listRefreshBtn->setEnable(true);
m_listNextBtn->setEnable(true);
Enable Refresh与Next两个Button
快速回复
限100 字节
 
上一个 下一个