我有一个嵌入了script/jit的Qt应用程序。现在,我想在QTextEdit (更具体的QPlainTextEdit)上接收脚本的输出。为此,正在发出回调。我面临的问题是,无论我尝试什么,TextEdit的输出要么延迟到脚本完成,要么在2-3秒后被卡住(然后延迟到脚本完成)。我尝试使用信号和插槽进行更新,但也尝试直接调用函数-两者都不起作用。此外,重新绘制/更新TextEdit和父窗体,甚至QCoreApplication::flush()也几乎没有效果。看起来我做了一些根本错误的事情。有什么想法或例子可以实现“实时”更新吗?
顺便说一句,更新例程正在被调用-调试输出到标准输出是实时可用的。
发布于 2010-08-10 17:03:02
我只想用线程来勾画一个解决方案,我曾多次使用它来记录日志,并且它的工作方式是所期望的:
定义线程类:
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent=0) : QThread(parent) {}
signals:
void signalLogMessage(const QString &logMessage);
...
};当您想要在主线程中显示日志消息时,只需使用
emit signalLogMessage("Foo!");
在你的主线程中:
MyThread *thread = new MyThread(this);
connect(thread, SIGNAL(signalLogMessage(const QString&)),
this, SLOT(logMessageFromThread(const QString&)));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
...
thread->start();在那里logMessageFromThread做了一些类似myPlainTextEdit->appendPlainText(message)的事情。这在没有任何延迟或其他问题的情况下工作。
我希望这能有所帮助。
发布于 2010-08-12 15:12:41
请允许我自己回答这个问题(部分)。首先,我们必须了解Qt本身在很大程度上是围绕着它自己的信号和插槽概念构建的。因此,不能期待QTextView的“实时”更新,因为向其添加文本(可能是通过文本光标或简单的追加)只会触发一个信号。因此,当您只有一个线程时,无论您做什么,您所要做的就是触发用于更新小部件的信号。相应的时隙将以低得多的优先级被处理,因此在阻塞工作器例程结束之后。所有这一切都可以通过调用QCoreApplication::processEvents()来缓解,正如Idan K在注释中指出的那样。这将强制对所有未处理的事件进行顺序处理,并随后返回。使用此功能,QTextEdit可用作“实时”输出控制台。然而,正如Idan和Greg所指出的,最佳解决方案使用单独的工作线程,向GUI线程发出信号。因为它们是单独的线程,所以GUI可以在worker继续运行的同时处理相应的插槽。因此,理论上输出可能会有一点延迟。以上解决方案,但整个应用程序将保持响应。
此外,我还想补充说,我使用QThread和mono时遇到的问题是,通过在线程外部创建全局应用程序域并按照建议的here使用mono_thread_attach()来解决问题。它在Mac和Windows7上都运行良好。
https://stackoverflow.com/questions/3446955
复制相似问题