c++ - 在继承自 QObject 的类中使用信号

标签 c++ qt inheritance signals-slots

我问是否有一种方法可以在继承自 QObject 的类中使用 signals,如下所示:

我的父类(super class).cpp

#include "mysuperclass.h"

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

我的父类(super class).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()));
}

我的子类.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();
};

最佳答案

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

来自 Qt's documentation :

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

示例

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: 标签。插槽毕竟是常规方法。当然,如果您添加新的槽或信号,则必须使用它。

关于c++ - 在继承自 QObject 的类中使用信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539405/

相关文章:

c++ - 在 opengl 中渲染 obj 文件时出现黑色窗口

c++ - QStates 的安全 getter

java - 实例字段的继承如何在此特定代码中工作?

c++ - 在模板化的嵌套和继承类中未检测到变量

c++ - 不明确的转换 - C++

c++ - 如何劫持DLL来锁定Windows中的所有目录来验证

c++ - QXmlQuery - 将参数传递给 XSLT

c++ - 覆盖 C++ 虚方法

c++ - 我的 C++ 代码永远不会通过 else 语句执行

android - 错误: undefined reference to 'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'