【问题标题】:Using signals into a class which is inheriting from QObject在继承自 QObject 的类中使用信号
【发布时间】:2017-09-18 06:16:13
【问题描述】:

我问是否有办法在继承自 QObject 的类中使用 signals,如下所示:

mysuperclass.cpp

#include "mysuperclass.h"

MySuperclass::MySuperclass(quint16 port, QObject *parent) :
  QObject(parent), port(port)
{
  this->connected = false;
}

mysuperclass.h

#include <QAbstractSocket>

class MySuperclass: public QObject
{
  Q_OBJECT
public:
  explicit MySuperclass(quint16 port = 0, QObject *parent = 0);

signals:
   //there is nothing here
public slots:
  virtual void newValue(){qDebug() << "newValue";}
  virtual void connectionEstablished(){qDebug() << "connectionEstablished";}
  virtual void disconnected(){qDebug() << "disconnected";}
protected:
  QAbstractSocket* networkSocket;
  quint16 port;
  bool connected;
};

我的子类.cpp

#include <QTcpSocket>
#include <QHostAddress>

MySubClass::MySubClass(quint16 ServerPort, QObject *parent) : 
  MySuperClass(ServerPort, parent) 
{
  this->networkSocket = new QTcpSocket(this);
  ...
  connect(this->networkSocket, SIGNAL(connected()),this,
    SLOT(connectionEstablished()));
  connect(this->networkSocket, SIGNAL(disconnected()),this,
    SLOT(disconnected()));
  connect(this->networkSocket, SIGNAL(readyRead()),this, SLOT(newValue()));
}

mysubclass.h

#include <QObject>
#include "mysuperclass.h"

class MySubClass: public MySuperClass
{
 public:
   MySubClass(quint16 ServerPort, QObject* parent=0);

 public slots:
   void newValue();
   void connectionEstablished();
   void disconnected();
};

【问题讨论】:

  • 你的类继承自自身......有点不清楚你在问什么:看看例如Qt 中的小部件层次结构,大量继承和信号/插槽。这不能回答你的问题吗?
  • 如果你尝试它会发生什么? (在解决“卢克,我是我自己的父亲”问题后;)
  • 抱歉错误,已修复:)

标签: c++ qt inheritance signals-slots


【解决方案1】:

您也必须在派生类中包含Q_OBJECT 宏(但不要再次从QObject 派生)。仅当派生类声明信号或槽时,宏才是必需的。发送父信号或连接父槽是没有必要的(这也意味着不需要重新定义已经存在的信号或槽)。

来自Qt's documentation

Q_OBJECT 宏必须出现在声明自己的信号和槽或使用 Qt 元对象系统提供的其他服务的类定义的私有部分中。

示例

class MySubClass : public MySuperClass {
  Q_OBJECT

  public:
    MySubClass(quint16 ServerPort, QObject* parent=0);

  public slots:
    void newValue();
    void connectionEstablished();
    void disconnected();
};

另一方面,如果你想连接到父类中的一个插槽,但在派生类中实现它,那么你必须将其设为虚拟:

class MySuperclass : public QObject {
  Q_OBJECT
  // ...
public slots:
  virtual void newValue(); // can be virtual pure also
};

class MySubClass : public MySuperClass {
public:
  virtual void newValue() override; // overrides parent's
}

请注意,派生类中无需使用Q_OBJECT 宏,也无需使用slot: 标签。插槽毕竟是正常的方法。当然,如果你添加新的槽或信号,你必须使用它。

【讨论】:

  • 对不起!但你的建议不起作用:/这是我得到的:warning: C4584: 'MySubClass': the basic class 'QObject' is already a basic class of 'MySuperClass'Error: C2385: ambiguous access to 'connect'
  • 能否请您发布两个类的更完整代码(更新您的问题)以及无法编译的connect 行?
  • 嗯...请用正确格式的代码更新您的问题,在 cmets 中阅读它非常困难。另外,发布您提到的超类和派生类的代码。
  • 抱歉代码难以辨认,但我没有其他办法:/
  • 同时,请查看更新后的答案,看看有关从QObject 继承的新增内容是否对您有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多