C++ 在从QObject继承的类中使用信号
我想问的是,是否有一种方法可以在继承自QObject的类中使用信号,如下所示: mysuperclass.cppC++ 在从QObject继承的类中使用信号,c++,qt,inheritance,signals-slots,C++,Qt,Inheritance,Signals Slots,我想问的是,是否有一种方法可以在继承自QObject的类中使用信号,如下所示: mysuperclass.cpp #include "mysuperclass.h" MySuperclass::MySuperclass(quint16 port, QObject *parent) : QObject(parent), port(port) { this->connected = false; } mysuperclass.h #include <QAbstractSock
#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;
};
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()));
}
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();
};
您还必须在派生类中包含Q_对象宏,但不要再次从QObject派生。只有当派生类声明信号或插槽时,宏才是必需的。对于发射父节点的信号或连接父节点的插槽,这是不必要的,也意味着不必重新定义现有的信号或插槽
发件人:
Q_对象宏必须出现在类定义的私有部分,该类定义声明自己的信号和插槽,或者使用Qt元对象系统提供的其他服务
范例
另一方面,如果要连接到父类中的插槽,但要在派生类中实现它,则必须使其成为虚拟的:
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:标签。插槽毕竟是正常的方法。当然,如果添加新插槽或信号,则必须使用它。您必须在派生类中也包含Q_OBJECT宏,但不要再次从QObject派生。只有当派生类声明信号或插槽时,宏才是必需的。对于发射父节点的信号或连接父节点的插槽,这是不必要的,也意味着不必重新定义现有的信号或插槽
发件人:
Q_对象宏必须出现在类定义的私有部分,该类定义声明自己的信号和插槽,或者使用Qt元对象系统提供的其他服务
范例
另一方面,如果要连接到父类中的插槽,但要在派生类中实现它,则必须使其成为虚拟的:
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:标签。插槽毕竟是正常的方法。当然,如果添加新的插槽或信号,则必须使用它。您的类从自身继承。。。有点不清楚你在问什么:看看Qt中的小部件层次结构,很多继承和信号/插槽。这不能回答你的问题吗?如果你试一下会发生什么?修好路加之后,我是我父亲的问题;很抱歉这个错误,一个修复了它的错误:您的类从自身继承。。。有点不清楚你在问什么:看看Qt中的小部件层次结构,很多继承和信号/插槽。这不能回答你的问题吗?如果你试一下会发生什么?修好路加之后,我是我父亲的问题;抱歉这个错误,一个修复了它:抱歉!但你的建议不起作用:/下面是我得到的:警告:C4584:“MySubClass”:基本类“QObject”已经是“MySuperClass”的基本类,错误:C2385:对“connect”的访问不明确。请你发布一个更完整的代码更新你对这两个类的问题以及未能编译的连接行的问题?嗯。。。请用正确格式的代码更新你的问题,在评论中阅读它是相当困难的。此外,请发布您提到的超级类和派生类的代码。很抱歉代码难以辨认,但我没有其他方法:/同时,请查看更新的答案,看看关于从QObject继承的新添加是否有助于您。对不起!但你的建议不起作用:/下面是我得到的:警告:C4584:“MySubClass”:基本类“QObject”已经是“MySuperClass”的基本类,错误:C2385:对“connect”的访问不明确。请你发布一个更完整的代码更新你对这两个类的问题以及未能编译的连接行的问题?嗯。。。请用正确格式的代码更新你的问题,在评论中阅读它是相当困难的。此外,请发布您提到的超级类和派生类的代码。很抱歉,代码难以辨认,但我没有其他方法:。同时,请查看更新的答案,看看关于从QObject继承的新添加是否有助于您。