为什么我的 QT C++ 应用程序在指示时不更新事件例程中的按钮文本?

Why does my QT C++ application not update a pushbuttons' text inside the event routine when directed to do so?

我是 Qt Creator 的新手,我有一个关于按钮文本更新没有在我期望的时间发生的原因的问题。下面是显示按钮事件的代码片段。该按钮启动另一个外部进程 (AVRDUDE),该进程依次读取通过 USB 连接的 Arduino 板的 EEPROM 的内容。然后数据被处理并显示在 UI 中。由于读取 EEPROM 的过程需要几秒钟才能执行,我想将调用此例程的 UI 按钮从“READ FROM EEPROM”更改为“READING !!”在执行此例程期间。例程完成后,return 按钮标签为“READ FROM EEPROM”。这是代码

void MainWindow::on_READ_FROM_EEPROM_clicked() // Read EEPROM into file "fromEEPROM.bin", then output values to UI
{
    ui->READ_FROM_EEPROM->setText("READING !!");
    call_AVRDUDE_read();
    int mBufferLength = 1024;                    // AVR 1K EEPROM space in 328p
    char mBuffer[mBufferLength];
    float fB[mBufferLength/4];
    QString filename = "fromEEPROM.bin";
    QFile mFile(filename);
    ui->fileCurrentlyDisplayed->setText(filename); // make this filename visable in UI
    if (mFile.exists())
    {
        if (mFile.open(QFile::ReadOnly))
            while (!mFile.atEnd())
                mFile.read(mBuffer,sizeof(mBuffer));
     mFile.close();
     memcpy(&fB, &mBuffer, mBufferLength);  // Next, take mBuffer array of chars and copy them into a float array format
     moveFloatArrayToGUI(fB);       // Fill in the tables in the GUI from this array of floats. Pass fB ARRAY to function
    }                               // that fills in UI
    ui->READ_FROM_EEPROM->setText("READ FROM EEPROM");
}

除第一行外,例程中的所有内容都完全按预期执行

ui->READ_FROM_EEPROM->setText("READING !!)"

最后一行

ui->READ_FROM_EEPROM->setText("READ FROM EEPROM");

我在按钮文本中看到的只是例程执行之前、整个过程和之后的 READ FROM EEPROM 标签。如果我更改最后一行的文本字符串,这个新文本将出现在 UI 按钮中。如果我注释掉最后一行,那么“正在阅读!!”将出现在 UI 按钮中,但仅在 之后 例程完成。

我在这里期待的是“正在阅读!!” msg 在输入时立即显示,然后会发生耗时的 AVRDUDE 调用,然后按钮文本将恢复为从 EEPROM 读取。我试着执行 ui->READ_FROM_EEPROM->setText("READING !!)" 从一个单独的按钮,它会立即更新从 EEPROM 按钮读取的内容,所以我很困惑为什么该行在输入时没有立即执行。 我错过了什么 and/or 我做错了什么? 问候, 马克

UI 仅在代码进入事件循环时才会更新,这在您的应用程序 returns 之前不会发生。 您可以通过在 UI 更新后调用 QCoreApplication::processEvents(); 来强制事件处理,但推荐的方法是将该阻塞代码推送到另一个线程并使用 signals/slots 更新您的 UI . 请参阅 https://doc.qt.io/archives/qq/qq27-responsive-guis.html#manualeventprocessing 以供参考。这篇文章很旧,但仍然有效。