kam*_*mal 1 c++ inheritance qt signals-slots
我问是否有一种方法可以signals在类继承的类中使用QObject:
mysuperclass.cpp
#include "mysuperclass.h"
MySuperclass::MySuperclass(quint16 port, QObject *parent) :
QObject(parent), port(port)
{
this->connected = false;
}
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
mysubclass.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()));
}
Run Code Online (Sandbox Code Playgroud)
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();
};
Run Code Online (Sandbox Code Playgroud)
您也必须Q_OBJECT在派生类中包含宏(但不要QObject再次派生).只有派生类声明信号或槽时,宏才是必需的.为了发出父信号或与父母的时隙连接,没有必要(这也意味着没有必要重新定义已经存在的信号或时隙).
从Qt的文档:
Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或者使用Qt的元对象系统提供的其他服务.
例
class MySubClass : public MySuperClass {
Q_OBJECT
public:
MySubClass(quint16 ServerPort, QObject* parent=0);
public slots:
void newValue();
void connectionEstablished();
void disconnected();
};
Run Code Online (Sandbox Code Playgroud)
另一方面,如果要连接到父类中的插槽但是在派生类中实现它,则必须将其设置为虚拟:
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
}
Run Code Online (Sandbox Code Playgroud)
请注意,不需要使用Q_OBJECT宏也不需要slot:在派生类中使用标签.毕竟插槽是正常的方法.当然,如果添加新的插槽或信号,则必须使用它.