QT 信号与槽connect
QT 信号与槽connect
QT中信号与槽的连接使用的connect
函数是一个静态函数,在类QObject
中定义。这里说的是QT5
环境下。更详细的介绍可以看这里http://www.devbean.net/2012/12/how-qt-signals-and-slots-work-qt5/
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
connect函数调用几个限制
1. 信号的发送者必须是
QObject
的派生类对象。不然会出现error: invalid conversion from 'XXX*' to 'const QObject*' [-fpermissive]...
的错误。2. 回调槽函数的对象必须是
QObject
的派生类对象。不然会出现error: no matching function for call to 'QObject::connect(XXX*,
的错误。这里要注意一点,信号函数无论存在与否,都不会报错的。但是如果信号的发送者是NULL
,那么会在运行的时候提示QObject::connect: Cannot connect (null)::信号函数() to 接收者::槽函数()
的问题。对于
1,2
两点,在connect
函数调用的时候强转类型也可以通过编译,但是运行的时候会提示No such slot QObject::
的问题。3. 槽函数所在的类的定义中必须添加宏
Q_OBJECT
,不然会出现QObject::connect: No such slot ...
的错误。这里必须和第
2
点联系起来,如果添加了Q_OBJECT
宏的类不是从QObject
派生的,moc
生成中间文件的时候会报错Error: Class contains Q_OBJECT macro but does not inherit from QObject
。如果添加了
Q_OBJECT
宏之后编译出现了undefined reference to ‘vtable for...
的错误,请删除build
目录下的Makefile
文件,再重新生成。4. 信号函数的
signals
修饰和槽函数的slots
修饰其实是必须的。虽然生成的中间代码中会去除掉。- 5.如果槽函数是on_控件名_信号名那么不需要主动调用connnect进行连接。
问题 | 原因 |
---|---|
error: no matching function for call to 'QObject::connect(XXX*, |
信号的发送者和接受者必须是QObject 的派生类对象。 |
QObject::connect: No such slot ... |
满足面的条件后,还必须满足槽函数所在类的定义中添加(使用)了Q_OBJECT 宏 |
Error: Class contains Q_OBJECT macro but does not inherit from QObject |
添加了Q_OBJECT 宏的类不是从QObject 派生的 |
undefined reference to ‘vtable for... |
这是在添加了Q_OBJECT 宏之后编译出现,原因是没有更新Makefile 文件。请删除build 目录下的Makefile 文件,再使用qmake 重新生成。 |
No matching signal for on_XXXXX_XXXXX() |
槽函数是on_控件名_信号名形式,又显示的调用了connect进行连接,就会在运行时出现这个,但是没有什么关系。 |
connect函数代码
connect是一个模板函数,但是对参数的类型是有要求的。
这个函数的返回值是QMetaObject::Connection
类型的。
//Connect a signal to a pointer to qobject member function
//连接一个信号到 qobject 成员函数的指针 template <typename Func1, typename Func2>
static inline QMetaObject::Connection connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender,
Func1 signal,
const typename QtPrivate::FunctionPointer<Func2>::Object *receiver,
Func2 slot,Qt::ConnectionType type = Qt::AutoConnection
)
{
typedef QtPrivate::FunctionPointer<Func1> SignalType;
typedef QtPrivate::FunctionPointer<Func2> SlotType; //检查信号类是否有Q_OBJECT宏
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
"No Q_OBJECT in the class with the signal"); //compilation error if the arguments does not match.
//如果参数不匹配的编译错误。
//槽函数需要的参数比信号函数提供多。
Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
"The slot requires more arguments than the signal provides.");
//信号函数和槽函数的参数不是兼容的。
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
"Signal and slot arguments are not compatible.");
//信号函数返回类型是槽函数的不兼容的返回类型。
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
"Return type of the slot is not compatible with the return type of the signal."); const int *types = ;
if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types(); //QObject::connectImpl是用于执行连接的私有内部函数。
//槽函数的包装器,用于辅助调用该槽函数。
return connectImpl(sender, reinterpret_cast<void **>(&signal),
receiver, reinterpret_cast<void **>(&slot),
new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
typename SignalType::ReturnType>(slot),
type, types, &SignalType::Object::staticMetaObject);
}
QT 信号与槽connect的更多相关文章
- Qt 信号与槽
Qt信号与槽的理解 信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重 ...
- QT信号和槽
QT信号和槽 ============ 信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler) ...
- QT信号和槽函数学习笔记
//connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...
- Qt 信号和槽异常: QObject::connect: No Such slot baseClassName::subClassfunction() in ......
2019-08-14起笔 小熊的情况描述: 父类A继承自QWidget,所以父类A自动添加了Q_OBJECT. 子类B继承自父类A,子类B没有添加Q_OBJECT.在子类B中给动态创建的控件添加事件 ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- Qt信号与槽应用实例一
..... connect(m_pGlobelWidget,signal(globeControlClick(object,object)),this,slot(globeControlClick(o ...
- Qt 信号和槽函数
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.当某个信号被发射,就需要调用与之相绑定的槽函数.这与Windows下的消息机制类似,消息机制是基于回调函数.一个回调即是一个函数的 ...
- QT 信号与槽连接
转帖 http://www.cnblogs.com/cnhome/archive/2009/10/01/1577277.html 信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分.这个机制 ...
- Qt信号和槽的个人总结
1.connect connect(sender,SIGNAL(signal()),receiver,SLOT(slot())); 这里用到了两个宏:SIGNAL() 和SLOT():通过connec ...
随机推荐
- UIButton 的属性与方法
UIButton *btn=[UIButtonbuttonWithType:UIButtonTypeCustom];//一般都是设置为该类型 btn.frame=CGRectMake(100, 80, ...
- 9月19日下午JavaScript数组冒泡排列和二分法
数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...
- 微软.NET序列化格式
官方文档 https://msdn.microsoft.com/en-us/library/cc236844.aspx 对比 http://www.codeproject.com/Articles/3 ...
- VS2013-解决error C4996: 'fopen'问题
VS2013中如何解决error C4996: 'fopen'问题 初次使用vs系列编辑器编写控制台应用程序时常出现如下错误: error C4996: 'fopen': This function ...
- Quartz.NET总结(二)CronTrigger和Cron表达式
Quartz.NET的任务调度,主要就是依靠CronTrigger和Cron表达式.Cron是已经在UNIX存在了很长一段时间,它有着强大和可靠的调度能力.CronTrigger类也正是是基于Cron ...
- linq 多表分组查询统计
var q1 = from orderitem in q2 join pd in _iProductDetailContract.Entities on orderitem.ProductDetail ...
- JavaScript中一些怪异用法的理解
引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...
- 【转】跟我学Kafka之NIO通信机制
from:云栖社区 玛德,今天又被人打脸了,小看人,艹,确实,相对比起来,在某些方面差一点,,,,该好好捋捋了,强化下短板,规划下日程,,,引以为耻,铭记于心. 跟我学Kafka之NIO通信机制 ...
- linux下gimp的使用
参考资料: http://wenku.baidu.com/view/345c525f804d2b160b4ec070.html 没有视频, 只靠自己摸索使用... 参考文章: http://www.3 ...
- 【Junit】The import org.junit.Test conflicts with a type defined in the same file报错
引入Junit后,进行单元测试,莫名其妙报了个这样的错误 The import org.junit.Test conflicts with a type defined in the same fil ...