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 ...
随机推荐
- em 和 px相互转换
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Adaboost 算法
一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...
- 在Visual Studio中使用Git命令提示符
VS2015自带了Git插件,但有时候我觉得Git控制台命令更方便些. VS中本身不能把Git Bush作为浮动窗集成进来,但我们可以通过Power Shell来使用Git命令. ---------- ...
- LeetCode 094 Binary Tree Inorder Traversal
方法一:(递归) class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int ...
- Shiro安全登录框架
环境准备 本文使用Maven构建,因此需要一点Maven知识.首先准备环境依赖: <dependencies> <dependency> <groupId>juni ...
- cell 内部 设置width 总不对
今天 在Cell 里设置屏幕宽 如果 在layoutSubviews 使用 self.width(自己写的分类) 或者 self.view.size.width 都可以,这里 4 4s 5 5s 都 ...
- SQL 事务
/*========================事务==============================*/begin tran--开始事务 --开始写流程语句 --语句写完之后if @@ ...
- 服务器三大体系SMP、NUMA、MPP介绍
从系统架构来看,目前的商用服务器大体可以分为三类,即: 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访问结构(NUMA:Non-Uniform Memor ...
- 在同台电脑上再次安装MySql需要注意的事项
今天安装了一下mysql,出现的问题主要是在最后一步: msyql 安装到最后一步 start service 错误解决方法 1, 到控制面板里面先把 mysql 删除 . 2. 到 c 盘 C:\P ...
- 让dedecms autoindex,itemindex 从0到1开始的办法! 多重样式输出(借鉴)
原网址:http://my.oschina.net/lyx2012/blog/55888 [field:global name=autoindex runphp="yes"]@me ...