Qt怎样连接qt信号槽连接和槽

QT 信号与槽connect
QT 信号与槽connect
QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义。这里说的是QT5环境下。更详细的介绍可以看这里
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& SignalT
typedef QtPrivate::FunctionPointer&Func2& SlotT
//检查信号类是否有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.");
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信号与槽的理解 信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重 ...
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
..... connect(m_pGlobelWidget,signal(globeControlClick(object,object)),this,slot(globeControlClick(o ...
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.当某个信号被发射,就需要调用与之相绑定的槽函数.这与Windows下的消息机制类似,消息机制是基于回调函数.一个回调即是一个函数的 ...
转帖 http://www.cnblogs.com/cnhome/archive//1577277.html 信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分.这个机制 ...
1.connect connect(sender,SIGNAL(signal()),receiver,SLOT(slot())); 这里用到了两个宏:SIGNAL() 和SLOT():通过connec ...
信号与槽 背景: 面向过程 模块之间低耦合设计(高内聚). 函数调用: 直接调用 回调调用(低耦合) 面向对象 模块之间低耦合设计(高内聚) 对象调用 直接调用 接口调用 QT: 信号与槽解决问题:
最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...
信号与槽用于对象之间的通信.信号与槽机制是Qt的核心特性和区别于其他框架的特性. Introduction 在GUI程序中,当我们改变一个widget,经常需要其他的widget得到通知.更普遍的是, ...
在这篇文章中,我们将阐述 Redis 最常用的使用场景,以及那些影响我们选择的不同特性. 1.会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cac ...
angularjs自动化测试系列之jasmine jasmine参考 html &!DOCTYPE html& &html lang=&en&& &h ...
最近在研究Web安全相关的知识,特别是SQL注入类的相关知识.接触了一些与SQL注入相关的工具.周末在家闲着无聊,想把平时学的东东结合起来攻击一下身边某个小伙伴去的公司,看看能不能得逞.不试不知道,一 ...
Object类型是JavaScript中使用最多的一种类型.创建Object实例的方式有多种,接下来一一列举. 1. Object构造函数 person1的friends属性修改影响了person2的 ...
velocity与freemaker.jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在gith ...
http://www.cnblogs.com/cgwolver/archive//1368350.html
手工改,1.在eclipse 上新建一个空的项目;2.点击android studio 中的android 视图,
a.替换as 中的AndroidManifest.xml -&
声明:本系列随笔主要用于记录c语言的常备知识点,不能保证所有知识正确性,欢迎大家阅读.学习.批评.指正!!你们的鼓励是我前进的动力.严禁用于私人目的.转载请注明出处:http://www.cnblog ...
别告诉我从i=a.length开始打印然后i--!因为数组没变啊,只是打印顺序变了.有木有啥别的方法,除了冒泡插入选择.. nteger [] array=new Integer[]{1,2,3,4, ...
Javascript创建对象 最简单的方法:创建object实例. var person=new Object(); person.name=&Joey&;person.age=2 ...扫一扫体验手机阅读
QT开发(十三)——QT信号与槽机制
<span type="1" blog_id="1868745" userid='
256篇文章,66W+人气,0粉丝
大数据时代的微服务之路
¥51.00418人订阅
<span type="1" blog_id="1868745" userid='在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
相比gtk中的回调,或者mfc的对等功能,有什么技术上的优势吗?如果有的话,体现在哪些地方? 本人小白,就感觉用起来好像更方便一些,愿大家多多指教
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
就说回调吧,有时候经常会发现会有情况是要一直回调,回调,回调。我印象中写js的会对这个有一点点感触。
Qt的信号可以和槽连在一起,也可以用信号连接信号。信号和槽的机制让代码在可读性和简洁程度上都要好一点点。
另外有没有用过网络相关的模块呢,在异步上,信号和槽基本上让程序猿更容易写代码一些。
但是所有的东西都是两面的。这个世界没有完美的技术,只有最合适的技术
信号和槽在给你便利的同时,会打乱程序结构。在调试的时候,有时会麻烦一些。经常因为找不到是哪里发了信号导致了槽的触发,程序逻辑不对,这个也是比较蛋疼的
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。Qt 信号与槽连接_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Qt 信号与槽连接
&&信号与槽连接详解
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Qt信号和槽的应用(新手篇)',
blogAbstract:' 前几天看了框架并且在框架上写程序,遇到了一些麻烦,比如怎么把窗口模块和上层模块联系起来如下图。&&&&&&&&&&&&&&&&&&&&&&&&&&&&
GUi&&&&&&&&&&&&&&&&&&&&&&&&&&&
\\&&&&&&&&&&&&&&&&&&&
窗口 1&&&&&&&&
窗口 2由于还在入门阶段,以前总以为信号和槽不过就类似于按钮单击响应一下,执行槽函数而已。忽略了connect(QObject, , QObject,) 以前写的都是this。 也没思考,也没了解类的真正概念。connect(ui-&listWidget,SIGNAL(currentTextChanged(QString)),label,SLOT(setText(QString)));',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 qt信号与槽连接 的文章

 

随机推荐