为什么我的 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 以供参考。这篇文章很旧,但仍然有效。
我是 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 以供参考。这篇文章很旧,但仍然有效。