【问题标题】:How can I change Qt GUI widgets on a QMainWindow from a QThread which is a member?如何从成员 QThread 更改 QMainWindow 上的 Qt GUI 小部件?
【发布时间】:2018-01-31 14:29:47
【问题描述】:

我的主窗体是 Qt Designer 并继承自 QMainWindow 和 UI。我需要运行其他线程,并且我需要这些线程来更改主窗体上的内容,例如进度条、LCD。

如何让其他线程访问主窗体上的小部件?

感谢您的帮助。

【问题讨论】:

  • 感谢您的回复,这似乎是一个不错的选择。我已经设置了一个信号和一个插槽,并将它们连接起来,但插槽从未运行过。我似乎遇到了与 Flavius Suciu 提供的链接完全相同的问题。有什么建议吗?
  • 我认为你不能使用thread->moveToThread(thread)。正如在 Flavius 链接的帖子中一样。如果您的插槽没有被调用,connect() 可能会失败。您与调试 Qt 链接,是吗?只有在连接失败时打印警告。

标签: c++ qt4


【解决方案1】:

使用信号/插槽。 奇趣科技从 4.x 引入了一个线程安全的信号机制,例如使用 connect() 函数中的 Qt::BlockingQueuedConnection 参数。

更多详情见: http://lists.trolltech.com/qt-interest/2007-03/thread00260-0.html

【讨论】:

    【解决方案2】:

    正如 Flavius Suciu 所提到的,您可以使用跨线程信号/插槽连接。它们也可以携带参数,但是,如果您不只是将基本类型或 Qt 类型作为信号参数传递,而是您自己的自定义 struct,则需要以这种方式告诉 Qt:

    namespace MyNamespace { // if any...
        struct MyClass { /* ... */ };
    } // if any
    Q_DECLARE_METATYPE( MyNamespace::MyClass )
    

    这允许将MyClass 填充到QVariants 中,这是Qt 在内部使用的,用于在线程边界上传送信号参数的副本。

    您可能还需要致电

    qRegisterMetaType<MyNamespace::MyClass>();
    

    在尝试任何信号/插槽跨线程连接之前,它一定会在某个地方执行(例如,在main() 或您的QThread 子类构造函数中)。

    查看Q_DECLARE_METATYPE的文档

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2021-04-25
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2013-04-21
      • 2020-08-27
      相关资源
      最近更新 更多