最近在公司项目中开发串口,因为历史原因串口要包装一下,且包装类需要继承自一个纯C++类。

QSerialPort可以使用slot function来获取从串口读到的数据,以及写入串口的bytes个数。因此就给自己的类加了对应的槽函数。代码示例如下:

#include <QObject>
class CBase
{
public:
CBase();
~CBase();
}; class CDerive:public CBase,public QObject
{
Q_OBJECT
public:
CDerive();
~CDerive();
public slots:
void slot1();
signals:
};

当然了,这段代码压根不能编译,错误如下:

debug/moc_CObejctTest.cpp:77:8: error: 'staticMetaObject' is not a member of 'CBase'

{ &CBase::staticMetaObject, qt_meta_stringdata_CDerive.data,

^

debug/moc_CObejctTest.cpp: In member function 'virtual void* CDerive::qt_metacast(const char)':

debug/moc_CObejctTest.cpp:94:12: error: 'qt_metacast' is not a member of 'CBase'

return CBase::qt_metacast(_clname);

^

debug/moc_CObejctTest.cpp: In member function 'virtual int CDerive::qt_metacall(QMetaObject::Call, int, void**)':

debug/moc_CObejctTest.cpp:99:11: error: 'qt_metacall' is not a member of 'CBase'

_id = CBase::qt_metacall(_c, _id, _a);

^

debug/moc_CObejctTest.cpp: In member function 'virtual void
CDerive::qt_metacast(const char*)':

debug/moc_CObejctTest.cpp:95:1: warning: control reaches end of non-void function [-Wreturn-type]

}

^

Makefile.Debug:316: recipe for target 'debug/moc_CObejctTest.o' failed

mingw32-make[1]: *** [debug/moc_CObejctTest.o] Error 1

去查看Qt生成的moc文件:

const QMetaObject CDerive::staticMetaObject =
{
{
&CBase::staticMetaObject, //-----------------
qt_meta_stringdata_CDerive.data,
qt_meta_data_CDerive,
qt_static_metacall,
Q_NULLPTR,
Q_NULLPTR
}
};

注意其中有注释的一行,CBase并不是继承自QObject,所以也就不存在staticMetaObject类。 可是CDerive明明也有继承自QObject类,为啥生成的moc认到了CBase了呢

然后想到把QObject放到第一个父类的位置。如下:

class CDerive:public QObject,public CBase

这样就可以编译通过了。生成的moc如下:

const QMetaObject CDerive::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_CDerive.data,
qt_meta_data_CDerive, qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};

这就尴尬了。 难道moc只认继承列表中第一个位置的?

这个问题有空要查一下。。。。O(∩_∩)O哈哈哈~

Qt多重继承时的信号与槽的更多相关文章

  1. 第七章 探秘Qt的核心机制-信号与槽

    第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...

  2. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...

  3. 2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)

    本章主要内容如下: 1) 窗口组件(QWidget) 2) QT坐标系统 3) 消息处理(信号与槽) 窗口组件(QWidget) 介绍 Qt以组件对象的方式构建图形用户界面 Qt中没有父组件的顶级组件 ...

  4. Qt对象模型之一:信号和槽

    一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...

  5. Qt Quick 事件处理之信号与槽(foruok的博客)

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...

  6. Qt 编程指南 3 信号和槽沟通

    https://qtguide.ustclug.org/ 1 信号和槽 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键, ...

  7. Qt Quick中的信号与槽

    在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...

  8. Qt 和 Boost关于信号和槽的对比说明

    对比 无论是 Qt 的实现方式还是 Boost 的实现方式,除了必须的定义信号和槽的类之外,都不需要额外的类. 两种实现都解决了类爆炸的问题.下面让我们对照着来看一下我们前面的分析. 两个不同的术语以 ...

  9. Qt带参数的信号和槽

    在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...

随机推荐

  1. windows平台源码编译最新版openssl

    本文有问题,待改中................. 1.从openssl官网下载最新版openssl      https://www.openssl.org/source/ The latest ...

  2. 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)

    2013年02月27日 PHP开源系统 暂无评论 阅读 497 views 次 在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,云采集,ET,三人行 ...

  3. UIkit框架之uiUIapplication

    1.继承链:uiresponder:NSObject 2.使用 sharedApplication方法来存取对象 3.这个类可以遵守协议是UIApplicationDelegate 4.获取app的实 ...

  4. Ubuntu gcc缺失问题

    在安装redis过程中,需要使用make编译源码,但发现linux中缺失gcc,系统为Ubuntu12. 一般情况下,可使用sudo apt-get install gcc或者sudo apt-get ...

  5. Send Push Notifications to iOS Devices using Xcode 8 and Swift 3, APNs Auth Key

    Send Push Notifications to iOS Devices using Xcode 8 and Swift 3 OCT 6, 2016 Push notifications are ...

  6. 去掉tableView的header view的粘黏性

    有的项目中,需要使用tableview的headerview,但是想让headerview粘在最顶不,希望和cell一起滚动,可以试试下面的代码来帮你实现这个需求: - (void)scrollVie ...

  7. div 在页面上漂浮

    <div id="codefans_net" style="position:absolute;z-index:5;">        <a& ...

  8. 2016年JS面试题目汇总

    1.怎样添加.移除.移动.复制.创建和查找节点? //1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 ...

  9. Maven修改本地仓库路径

    仓库知识参考 http://www.cnblogs.com/luotaoyeah/p/3785044.html 1. 修改配置文件settings.xml 假设你的maven位置在 D:\apache ...

  10. mac下 jenkins 环境搭建

    这几天搞了一些持续集成的工作,在所难免的接触到了jenkins ,下边写一下jenkins 在 mac os 环境下的搭建和配置. 1.tomcat 下载 前往apache 官网下载所需版本的tomc ...