• 4181阅读
  • 4回复

[提问]QpushButton设置checkable属性后的相关问题求解 [复制链接]

上一主题 下一主题
离线michael王
 

只看楼主 倒序阅读 楼主  发表于: 2018-03-20
小弟最近在学习Qt编写串口通信程序,遇到一个问题,自己想了想没有解决,请教一下各路大神
想着设置QpushButton为checkable状态,按钮弹起时串口处于关闭状态,按下时串口处于开启状态。
void MainWindow::on_pushButton_switch_toggled(bool checked) //打开与关闭串口槽函数
{    
    if(checked)    
    {        
        if(my_serialport->open(QIODevice::WriteOnly))
        {            
            my_serialport->setBaudRate(19200);
            //设置波特率为19200
            my_serialport->setDataBits(QSerialPort::Data8);
            //设置数据位为8
            my_serialport->setParity(QSerialPort::NoParity);
            //设置为无奇偶检验
            my_serialport->setStopBits(QSerialPort::OneStop);
           //设置停止位为1
            my_serialport->setFlowControl(QSerialPort::NoFlowControl);
            //设置为无控制流
        }
        else
        {            
            //ui->pushButton_switch->setCheckable(false);
            ui->pushButton_switch->setChecked(!checked);
            FailPromptWindow();
            //ui->pushButton_switch->setCheckable(true);
            cout << "serial open fail" << endl;
        }
    }    
    else
    {
          if(my_serialport->isOpen())  //若串口处于打开状态,关闭串口
         {
               my_serialport->close();
          }    
     }
}

connect(ui->pushButton_switch,SIGNAL(toggled(bool)),this,SLOT(on_pushButton_switch_toggled(bool)));
//关联pushButton_swtich按键与打开关闭串口槽函数

connect语句与开关函数如上所示,当串口打开失败时,重设pushButton开关状态为弹起状态,并弹出串口打开失败的提示窗口 FailPromptDialog(); 但是实际运行时发现,在打开失败情况下,可能是由于重置了开关状态:

ui->pushButton_switch->setChecked(!checked);

所以失败提示窗口出现了两次,并且“serial open fail”也在控制台输出两次。
为了解决这个问题,想着在重置开关状态前先把开关设置成enable状态,但是好像失败了。

ui->pushButton_switch->setEnabled(false);...(ui->pushButton_switch->setChecked(!checked);)ui->pushButton_switch->setEnabled(true);

虽然觉得不可行,但再次尝试设置为uncheckable状态,好像又失败了。

ui->pushButton_switch->setCheckable(false);...(ui->pushButton_switch->setChecked(!checked);)ui->pushButton_switch->setCheckable(true);
有没有大神能指教一下怎么设置可以避免两次触发失败提示窗口

PS:最好能保留使用pushButton的check属性。

离线yuyu414

只看该作者 1楼 发表于: 2018-03-21
先disconnect,设置完再connect
离线never_forget

只看该作者 2楼 发表于: 2018-03-21
这个函数 on_pushButton_switch_toggled 来看,你是直接从界面上跳转的槽函数,为什么还要用代码关联一次?另外如果不是这个问题导致的,建议查看一下逻辑吧,有可能逻辑上还有别的地方触发了这个信号~
离线大漠之鹰

只看该作者 3楼 发表于: 2018-03-21
设置的时候 signalBlock true,设置完后 false
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线michael王

只看该作者 4楼 发表于: 2018-03-21
回 never_forget 的帖子
never_forget:这个函数 on_pushButton_switch_toggled 来看,你是直接从界面上跳转的槽函数,为什么还要用代码关联一次?另外如果不是这个问题导致的,建议查看一下逻辑吧,有可能逻辑上还有别的地方触发了这个信号~
 (2018-03-21 09:00) 

灰常感谢,脑子一热多写了个connect关联,注释掉之后不再出现两次触发的问题,看来问题不是出在重置pushbutton属性的上
快速回复
限100 字节
 
上一个 下一个