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

我有这样的课程

class GUI : public QWidget, public QThread

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

谢谢

【问题讨论】:

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

标签: c++ qt qthread


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您不能从多个 QObject 继承。

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

      class GUI : public QWidget 
      {
        QThread myThread;
      };
      

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

      【讨论】:

      • 只有主线程可以对小部件进行操作,所以让小部件成为线程的成员似乎很奇怪。这可以实现什么?
      • “你应该从 QMainWindow 继承”是错误的,只有在你确实想要 QMainWindow 提供的某些功能时才应该这样做。任何没有父级的 QWidget 都会自动成为一个窗口。
      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多