首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“实时”更新Qt TextView

“实时”更新Qt TextView
EN

Stack Overflow用户
提问于 2010-08-10 15:39:03
回答 2查看 4.3K关注 0票数 4

我有一个嵌入了script/jit的Qt应用程序。现在,我想在QTextEdit (更具体的QPlainTextEdit)上接收脚本的输出。为此,正在发出回调。我面临的问题是,无论我尝试什么,TextEdit的输出要么延迟到脚本完成,要么在2-3秒后被卡住(然后延迟到脚本完成)。我尝试使用信号和插槽进行更新,但也尝试直接调用函数-两者都不起作用。此外,重新绘制/更新TextEdit和父窗体,甚至QCoreApplication::flush()也几乎没有效果。看起来我做了一些根本错误的事情。有什么想法或例子可以实现“实时”更新吗?

顺便说一句,更新例程正在被调用-调试输出到标准输出是实时可用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-10 17:03:02

我只想用线程来勾画一个解决方案,我曾多次使用它来记录日志,并且它的工作方式是所期望的:

定义线程类:

代码语言:javascript
复制
class MyThread : public QThread
{
  Q_OBJECT
public:
  MyThread(QObject *parent=0) : QThread(parent) {}
signals:
  void signalLogMessage(const QString &logMessage);

...
};

当您想要在主线程中显示日志消息时,只需使用

emit signalLogMessage("Foo!");

在你的主线程中:

代码语言:javascript
复制
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)的事情。这在没有任何延迟或其他问题的情况下工作。

我希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 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上都运行良好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3446955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档