Qt多重继承时的信号与槽
最近在公司项目中开发串口,因为历史原因串口要包装一下,且包装类需要继承自一个纯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多重继承时的信号与槽的更多相关文章
- 第七章 探秘Qt的核心机制-信号与槽
第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...
- Qt Quick 事件处理之信号与槽
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...
- 2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)
本章主要内容如下: 1) 窗口组件(QWidget) 2) QT坐标系统 3) 消息处理(信号与槽) 窗口组件(QWidget) 介绍 Qt以组件对象的方式构建图形用户界面 Qt中没有父组件的顶级组件 ...
- Qt对象模型之一:信号和槽
一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...
- Qt Quick 事件处理之信号与槽(foruok的博客)
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...
- Qt 编程指南 3 信号和槽沟通
https://qtguide.ustclug.org/ 1 信号和槽 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键, ...
- Qt Quick中的信号与槽
在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...
- Qt 和 Boost关于信号和槽的对比说明
对比 无论是 Qt 的实现方式还是 Boost 的实现方式,除了必须的定义信号和槽的类之外,都不需要额外的类. 两种实现都解决了类爆炸的问题.下面让我们对照着来看一下我们前面的分析. 两个不同的术语以 ...
- Qt带参数的信号和槽
在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...
随机推荐
- redis主从复制搭建
1. 安装redis-2.4.6-setup-32-bit.exe 2. 打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis) 运行 redis-server.exe redis.con ...
- Android侧滑菜单代码实现
前两天学习了hyman老师讲的Android侧滑菜单的实现,经过自己的整理分享出来给大家学习一下 现在很多APP都有菜单侧滑的功能,本篇文章主要讲解使用自定义的HorizontalScrollView ...
- NOIP 考前 图论练习
LJOJ 1500: 题目:http://www.docin.com/p-601990756.html Sol:贪心,从叶子结点往上加入无法传递了,就需要建设. Dfs返回的是到达叶子节点最多所要的能 ...
- Unity3D教程:茄子童萌會
http://s.epb.idv.tw/han-shi-ku/unity Unity 0000 Unity3D學習之路 - C#學習筆記(一) 0001 Unity3D學習之路 - C#學習筆記(二) ...
- 服务器三大体系SMP、NUMA、MPP介绍
从系统架构来看,目前的商用服务器大体可以分为三类,即: 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访问结构(NUMA:Non-Uniform Memor ...
- Linux初学---->WinSCP+Putty
十二是个初学者,就觉得有意思.所以学下Linux.如果有啥不对的情路过大牛多多指点.心中也开始学着写博客,因为觉得博客对于学习技术不仅是个记录,还是对学的东西一个复习,一个反思,一个交流.另如果有好的 ...
- jquery操作input值总结
获取选中的值获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val(); 获取select被选中项的文本var item = $ ...
- 一个App Widget实例第一次创建时被调用
事实上已经有很多的所谓的路由框架做到这一点,我也没有去研究别的,加上一直对backbone这个框架的评价不错,所以就琢磨着怎么用它实现我所需要的SPA的url管理了. 比如,你可能会说"如果 ...
- MVCC PostgreSQL实现事务和多版本并发控制的精华
原创文章,同步发自作者个人博客,http://www.jasongj.com/sql/mvcc/ PostgreSQL针对ACID的实现机制 事务的实现原理可以解读为RDBMS采取何种技术确保事务的A ...
- margin负值的几种妙用
1:定位+margin负值实现元素水平垂直居中 div{ position: absolute; z-index: 1; left: 50%; margin-left: -50px; width: 1 ...