【问题标题】:"real time" update a Qt TextView“实时”更新 Qt TextView
【发布时间】:2014-04-12 00:40:06
【问题描述】:

我有一个带有嵌入式脚本/jit 的 Qt 应用程序。现在我想在 QTextEdit(更具体的 QPlainTextEdit)上接收脚本的输出。为此,正在发出回调。我面临的问题是,无论我尝试输出到 TextEdit 的任何内容,要么延迟到脚本完成,要么在 2-3 秒后卡住(然后延迟到脚本完成)。 我尝试使用信号和插槽进行更新,但也尝试使用直接函数调用 - 均未奏效。还重新绘制/更新 TextEdit 和父表单,甚至 QCoreApplication::flush() 确实显示很少/没有效果。好像我在做一些根本错误的事情。任何想法或示例如何实现“实时”更新?

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

【问题讨论】:

  • 哪个线程正在执行回调?更具体地说,您在哪个线程中更新 QTextEdit?
  • 它不是线程化的——这可能是问题的一部分。所以一切(据我所知)都发生在主线程中。我尝试使用线程,但是在 QThread 中启动 mono JIT 会导致与 GC 相关的崩溃(它也喜欢启动 pthreads?) - 至少在 Mac 上(在 Windows 上我没有真正的调试输出,因为我的 gdb 是静音的出于某种原因)。
  • 这可能就是您的更新无法实时看到的原因。您可以尝试调用 QCoreApplication::processEvents。但真正的解决方案是在单独的线程中运行你正在做的任何事情,并使用插槽/信号来更新你的 GUI(替换你的回调)。
  • 感谢您对 processEvents 的提示。我将尝试再次设置 QThread,但与此同时 processEvents 解决了我的问题。

标签: c++ qt mono qt4


【解决方案1】:

只是为了使用线程绘制一个解决方案,我已经多次将其用于记录目的并且可以按需要工作:

定义你的线程类:

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)。 这工作没有任何延迟或其他问题。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    请允许我自己回答这个问题(部分)。 首先,必须了解 Qt 本身是围绕其自己的信号和插槽概念构建的。因此,不能期望 QTextView 的“实时”更新,因为向其中添加文本(可能是通过文本光标或简单的附加)只会触发一个信号。因此,当您只有一个线程时,无论您做什么,您所做的只是触发更新小部件的信号。相应的插槽将以低得多的优先级进行处理,因此在阻塞工作程序完成之后。所有这一切都可以通过调用 QCoreApplication::processEvents() 来缓解,正如 Idan K 在 cmets 中指出的那样。这强制所有未处理事件的顺序处理并随后返回。使用此功能 QTextEdit 可以用作“实时”输出控制台。 然而,正如 Idan 和 Greg 所指出的,最好的解决方案使用单独的工作线程,向 GUI 线程发出信号。由于这些是单独的线程,因此 GUI 可以在 worker 继续运行时处理相应的插槽。所以理论上的输出可能会有点延迟。到上述解决方案,但整个应用程序将保持响应。

    我还想补充一点,我使用 QThread 和 mono 的问题通过在线程外部创建全局应用程序域并按照建议 here 使用 mono_thread_attach() 来解决。它适用于 Mac OS X 和 Windows 7。

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多