我對 Qt Creator 非常陌生,并且對按鈕文本的更新在我期望的時間沒有發生的原因有疑問。下面是顯示按鈕事件的代碼片段。按鈕啟動另一個外部行程 (AVRDUDE),該行程依次讀取通過 USB 連接的 Arduino 板的 EEPROM 的內容。然后處理資料并在 UI 中顯示。由于讀取 EEPROM 的程序需要幾秒鐘才能執行,我想將呼叫此例程的 UI 按鈕從“READ FROM EEPROM”更改為“READING !!” 在執行此例程期間。程式完成后,將按鈕標簽回傳到“從 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");
我在按鈕文本中看到的只是在執行例程之前、始終和之后從 EEPROM 讀取標簽。如果我更改最后一行的文本字串,這個新文本將出現在 UI 按鈕中。如果我注釋掉最后一行,那么“READING !!” 將出現在 UI 按鈕中,但僅在例程完成后。
我在這里期待的是“閱讀!!” msg 在輸入時立即顯示,然后會發生耗時的 AVRDUDE 呼叫,然后按鈕文本將恢復為從 EEPROM 讀取。我嘗試
ui->READ_FROM_EEPROM->setText("READING !!)"
從一個單獨的按鈕執行,它立即更新從 EEPROM 按鈕的讀取,所以我很困惑為什么該行在進入時沒有正確執行。我錯過了什么和/或我做錯了什么?問候,馬克
uj5u.com熱心網友回復:
UI 僅在代碼到達事件回圈時更新,直到您的應用程式回傳才會發生。您可以通過在 UI 更新后呼叫來強制處理事件QCoreApplication::processEvents();,但推薦的方法是將阻塞代碼推送到另一個執行緒并使用信號/插槽來更新您的 UI。請參閱https://doc.qt.io/archives/qq/qq27-responsive-guis.html#manualeventprocessing以供參考。這篇文章很舊,但仍然有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/456495.html
