我如何从 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】:你不能。 QWidget
和 QThread
都(非虚拟地)继承自 QObject
。因此,您没有虚拟派生,因此没有 QObject
的两个副本,这会使编译器感到困惑。 QObject
就是这样专门设计的。见:
据称有些人绕过了这个(现在找不到链接,但它在 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 继承?的主要内容,如果未能解决你的问题,请参考以下文章