1

我正在构建一些代码,我正在运行一个 while 循环,并且在循环内,我试图用 QLineEdit 的 setText() 更改几个文本框的内容。但是,仅在循环内调用 setText 是行不通的;文本框仅在代码运行后更改其实际值,而不是在每次迭代时更改。

我对 C++ 或 Qt 几乎没有经验,但我正在从事的项目必须使用它们。有什么帮助吗?

编辑:我猜这一定很简单,因为我缺乏熟悉/知识,我只是遇到了麻烦,但如果需要更多信息,我很乐意提供!

4

2 回答 2

4

问题是 QT 需要控制返回到 UI 线程的事件循环以更新 QLineEdit 的视觉外观。运行事件循环的快速而肮脏的方法是QCoreApplication::processEvents()在每次调用之后添加setText(). 修复它的正确方法是将设置文本框值的阻塞进程移动到另一个线程中,公开一个updateText(QString text)信号,将其连接到 TextBox 的setText(const QString & text)插槽,并在您希望更新文本时发出该信号。

有关更多详细信息,请参阅我对类似问题的回答:QProgressBar 完成加载后无法解释的延迟

您可能还想查看有关 QThreads 和 Qt 信号槽系统的一些文档:http: //harmattan-dev.nokia.com/docs/library/html/qt4/threads-qobject.html

于 2013-01-18T18:36:00.570 回答
1

就我而言,仅调用 repaint() 或 processEvents() 不会完成这项工作。

在您的函数循环中,同时 QCoreApplication::processEvents();调用and repaint();

for (i;...)
{
    //do your calculations
    //...

    QCoreApplication::processEvents();
    repaint();
}

调用 ui->mywidget->update() 也没有什么不同。

(针对 Kubuntu 12.10 上的 Qt4.8.3 和 Windows XP 上的 Qt5.0.1 测试)

于 2013-03-26T19:08:54.963 回答