我想在代码中的函数运行时在主窗口上设置标签文本。但是标签在函数结束之前不会改变。
for (int i = 0; i < files.size(); ++i) {
ui->label->setText(files[i]);
myfoo();
}
最佳答案
看不到标签更新的原因是更新 GUI 的主线程正忙于您的 for 循环,没有时间处理导致 GUI 小部件重绘的事件.
虽然您可以使用 QApplication::processEvents,但这并不理想,尤其是在您的函数处理期间收到许多事件的情况下。
处理此问题的正确方法是创建一个单独的线程 (QThread) 和一个派生自 QObject 的对象,该对象将在向主 (GUI) 线程发送消息以更新标签时正常工作。
与其重复代码,我建议您阅读 this article关于如何正确使用 QThread。没那么难。
然后你会改变你的函数,它现在在第二个线程的对象中,像这样:-
for (int i = 0; i < files.size(); ++i)
{
// calling UpdateLabel signal, which connects to an object on the main thread
UpdateLabel(files[i]);
myfoo();
}
假设来自 Worker 类的信号已连接到主线程上对象中的槽,例如 QMainWindow,您将在槽中接收文本并更新标签:-
void QMainWindow::UpdateLabel(const QString text)
{
ui->label->setText(text);
}
关于qt - 函数运行时如何设置标签文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22715564/