热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将信号用于继承自QObject的类

如何解决《将信号用于继承自QObject的类》经验,为你挑选了1个好方法。

我问是否有一种方法可以signals在类继承的类中使用QObject:

mysuperclass.cpp

#include "mysuperclass.h"

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

mysuperclass.h

#include 

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 
#include 

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 
#include "mysuperclass.h"

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

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

cbuchart.. 6

您也必须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();
};

另一方面,如果要连接到父类中的插槽但是在派生类中实现它,则必须将其设置为虚拟:

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:在派生类中使用标签.毕竟插槽是正常的方法.当然,如果添加新的插槽或信号,则必须使用它.



1> cbuchart..:

您也必须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();
};

另一方面,如果要连接到父类中的插槽但是在派生类中实现它,则必须将其设置为虚拟:

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:在派生类中使用标签.毕竟插槽是正常的方法.当然,如果添加新的插槽或信号,则必须使用它.


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Threadtowaitinfinitelyinaloopuntilaflagstatechange,thencallfunction.线程在循环中无限期等待,直到标志状 ... [详细]
  • AtonepointIhadlookedatimplementingaclasstemplateinC++thatwouldsupportanEnumthatwo ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • C++ OpenCV实战之标记点检测的实现
    C++ OpenCV实战之标记点检测的实现-在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。大致思路如下,首先先选择要处理的 ... [详细]
author-avatar
拍友2502908871
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有