【问题标题】:QT does not respond using a while loopQT 不使用 while 循环响应
【发布时间】:2017-05-28 01:26:17
【问题描述】:

我四处寻找,但没有找到这个问题的答案。

我正在进行 UART 通信,如果我按下按钮或处于“向下”位置,我想连续读取数据。问题是我正在使用一个while循环来做到这一点。当我尝试停止阅读并释放按钮时,程序冻结并且没有响应。任何帮助将不胜感激。部分代码如下。

void MainWindow::on_pushButton_3_toggled(bool checked)
{
    while(checked)
    {
        QByteArray datas = Serial_port.readAll();
        ui->textEdit->setText((QString)datas);
        qDebug()<<"Im here";
        msleep(100);
        qDebug()<<datas;
        qDebug()<<checked;
    }


qDebug()<<checked;

}

【问题讨论】:

  • 你阻塞了事件循环,当然它会阻塞 Qt 响应!如果您希望某事定期发生,您需要使用QTimer
  • 我假设 QSerialPort 有一个信号可以告诉您数据何时可用,因此您可能根本不需要 while 循环。
  • @drescherjm 是的,我有信号告诉我数据何时可用。如果不使用 while 循环并继续阅读,我怎么能做到这一点?
  • 将读取放入连接到信号的插槽中。不要在那个插槽中循环。只需阅读全部。将文本附加到您的小部件而不是替换它。

标签: c++ qt while-loop


【解决方案1】:

您正在阻塞事件循环,因此,Qt 无法处理事件。您可以尝试在循环期间调用 QApplication::processEvents(),这应该会使 UI 再次响应。

【讨论】:

    【解决方案2】:

    为什么你需要一个循环来执行这段代码?您是否使用函数 connect() 使您的点击事件正确?当你点击你开始你的循环并且你没有结束这个循环,你不需要这个循环,你从串口读取并把它放在 QBytearray 当它最终读取所有函数时读取下一行和下一行直到函数结束!

    但是如果您需要继续使用循环,请尝试在您的 ui 中创建一个复选框,以获得 true 或 false 并在循环中放置一个 if 以停止您的循环

    if(ui->cb->isChecked()) 
       checked = true; 
    else 
       checked=false; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多