我如何从 QWidget 和 QThread 继承?

Posted

技术标签:

【中文标题】我如何从 QWidget 和 QThread 继承?【英文标题】:how can i inherit from both QWidget and QThread? 【发布时间】:2011-02-05 10:53:58 【问题描述】:

我有这样的课程

class GUI : public QWidget, public QThread

当我执行上述操作时,我收到有关连接信号的错误。 The error says Reference to "connect" is ambiguous。有没有办法从两者继承?

谢谢

【问题讨论】:

请解释您为什么要这样做。由于无法完成(请参阅答案),我们想知道向您建议哪些事情。这需要更多信息。 我的程序通过火线从另一台计算机接收消息。收到的消息被定向到 GUI 从中读取它们的文件。我想在一个线程中处理火线消息,在另一个线程中处理 GUI。 【参考方案1】:

你不能。 QWidgetQThread 都(非虚拟地)继承自 QObject。因此,您没有虚拟派生,因此没有 QObject 的两个副本,这会使编译器感到困惑。 QObject 就是这样专门设计的。见:

http://lists.trolltech.com/qt-interest/2006-10/msg00711.html http://www.qtforum.org/article/23295/problem-opening-the-qfiledialog.html

据称有些人绕过了这个(现在找不到链接,但它在 Google 上,两周前我遇到了同样的问题),但它充其量是不安全的。

编辑:最好的方法可能是让另一个对象继承自 QThread 并将该对象保留为 GUI 类中的成员。这是大多数人在这个问题上所做的解决方法。

【讨论】:

【参考方案2】:

QWidgets 和 GUI 相关对象不能位于与应用程序主线程不同的线程中。你不应该同时继承它们。不能同时调用小部件的moveToThread() 函数。

【讨论】:

【参考方案3】:

您不能从多个 QObject 继承。

您可以从其中一个继承并将另一个作为成员变量并从那里开始工作。

class GUI : public QWidget 

  QThread myThread;
;

你已经为你的类命名了 GUI - 这是你程序的主 GUI 吗?请参阅 Qt 示例文件夹中的示例 - 它们在 GUI's 和 Threads 上都有示例程序。

【讨论】:

只有主线程可以对小部件进行操作,所以让小部件成为线程的成员似乎很奇怪。这可以实现什么? “你应该从 QMainWindow 继承”是错误的,只有在你确实想要 QMainWindow 提供的某些功能时才应该这样做。任何没有父级的 QWidget 都会自动成为一个窗口。

以上是关于我如何从 QWidget 和 QThread 继承?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GUI 停止 QThread

从继承的 QThread 迁移到 Worker 模型

停止线程的方法是啥(当我直接从 QThread 继承时)?

QWidget中结束QThread线程

Qt从QWidget类继承来自定义和使用它[重复]

QThread - 如何停止工人?