qt的槽手动触发和通过qt信号槽机制原理触发有什么不同吗

博客访问: 258330
博文数量: 90
博客积分: 2500
博客等级: 少校
技术积分: 648
注册时间:
分类: C/C++ 17:30:50
信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。
QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台:MS/WINDOWS-95、98、NT和2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及,QT很可能成为Linux窗口平台上进行软件开发时的GUI首选。
阅读(31137) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~
请登录后评论。QT信号槽与Delphi事件的对比
时间: 20:46:52
&&&& 阅读:530
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&最近学QT,对信号槽机制感到有点新鲜:
QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
自己总结其原理,就是一句话:把两个对象的函数相关(往往是设置同一个值),而不用考虑两个对象之间的关系,而且可以一对多发信号。缺点是,事先要规定哪些函数可以信号,哪些函数是槽。而且执行内容貌似有点单调。
这一机制号称先进,但Delphi里其实也有,而且应该更强大,因为信号源可以任意指定。而且设计时可以,动态改变也行。设计的时候,其机制被存储在.dfm文件里:
object Edit1: TEdit
Left = 136
Width = 121
Height = 21
TabOrder = 0
Text = ‘Edit1‘
OnChange = Edit1Change
OnClick = Edit1Click
这是可视化设计的做法。如果忘了这么做,动态写语句也可以,而且就一句话:
& & Edit1.OnClick := Button2Click (以OnClick事件为例,注意它不是OnMouseDown和OnMouseUp事件,但它们之间也有一定的联系。OnClick事件实际上是由OnMouseUp函数来执行的)
缺点是,必须要事先定义FOnClick这个事件,其类型是定义在TControl里的&FOnClick: TNotifyE 也就是必须事先定义槽。至于信号无所谓,只要参数一致即可(我猜测,通过复杂的语法变幻,没准参数都不必一致)。定义了槽就可以随时动态插拔要执行的函数,真是方便:
procedure TControl.Cbegin
if Assigned(FOnClick) then
FOnClick(Self);
通过调用Click这个专门检查槽和执行槽的函数,达到触发槽的目的。但是还不够,触发前后肯定要做一堆事情,并且要加上条件判断才行,看这里:
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);begin // 怪异,为什么要先执行这个?
if csCaptureMouse in ControlStyle then MouseCapture := F
if csClicked in ControlState then
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then C
DoMouseUp(Message, mbLeft);
但是到底谁来触发这个槽呢(第一驱动力)?Windows下说到底是要靠消息来触发,所以就很简单啦:
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;标签:&&&&&&&&&&&&&&&&&&&&&&&&原文地址:http://www.cnblogs.com/findumars/p/3905212.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!什么是QT中的信号插槽机制?与回调函数有何不同
全部答案(共1个回答)
程序基本都是事件触发的,只是时间传递的实现方法各不相同。
Windows里面用的是消息,回调函数,Qt用的是信号和槽,GTK+用的是回调函数。
答: 万的破绽在哪
答: 老师主动,多让学生背,思考,不学也得逼着,以后他们就知道对不对了
答: 计算科学是一门什么样的学科?
答:计算学科(通常也称作计算机科学与技术)作为现代技术的标志,已成为世界各国经济增长的主要动力。但如何认识这门学科,它究竟属于理科...
答: 对于那些有志于穷尽数学奥秘的学生,他总是循循善诱地予以启发和教育,而对于那些急功近利、在学习上不肯刻苦钻研的人,则毫不客气地予以批评
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415后使用快捷导航没有帐号?
本帖最后由 another_qt 于
18:30 编辑
各位大侠,想请问下,在GUI线程里使用定时器QTimer时;其connect方式不同如下:
& && &connect( timer, SIGNAL(timeout()), this, SLOT(updateUI()) ,Qt::QueuedConnection);
和 connect( timer, SIGNAL(timeout()), this, SLOT(updateUI()),&&Qt::DirectConnection);
这两者的区别是什么?
我的理解是,
第一种方式,当超时信号到达时,updateUI 会被放入gui线程的事件循环里,等程序返回事件循环时才真正去执行updateUI ;
第二种方式,当超时信号到达时,updateUI 会直接被调用;
不知道这样的理解是否有误?请大家指正
如果是这样理解的话,那是不是跟使用 QBasicTimer 里然后重载&&QObject::timerEvent() 差不多了?只是可能 QBasicTimer 的效率会更高些。
你可以试一试啊,其实实际效果是这样的:
就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没执行完,信号就来到了,这个时候有个问题:是执行完当前的方法再去执行该信号对应的槽函数呢?还是立马去执行槽函数呢?
1.Queued 是 “执行完当前的方法再去执行该信号对应的槽函数”
2.Direct 是 “立马去执行槽函数” 等到槽函数执行完了,再去执行那个“未执行完的方法”。。。
这样解释清楚吗? ...
你可以试一试啊,其实实际效果是这样的:
就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没执行完,信号就来到了,这个时候有个问题:是执行完当前的方法再去执行该信号对应的槽函数呢?还是立马去执行槽函数呢?
1.Queued 是 “执行完当前的方法再去执行该信号对应的槽函数”
2.Direct 是 “立马去执行槽函数” 等到槽函数执行完了,再去执行那个“未执行完的方法”。。。
这样解释清楚吗?
非常清楚;多谢 。那么第二个问题能否继续解答下?QBasicTimer 类重载 TimerEvent ,我看了下 QOject::event的源码,似乎 QBasicTimer
类触发的 TimerEvent 事件是放到QT的事件循环里处理的?&
看着这么多豆子,我却无能为力,着实让人生气
你可以试一试啊,其实实际效果是这样的:
就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没 ...
非常清楚;多谢 。那么第二个问题能否继续解答下?QBasicTimer 类重载 TimerEvent ,我看了下 QOject::event的源码,似乎 QBasicTimer&&类触发的 TimerEvent 事件是放到QT的事件循环里处理的?
这个也是信号触发吧,信号的话,都是放到那个事件循环处理的吧,,main.cpp里的return app.exec()就是启动这个循环线程的,,我是感觉是这样,这个不是很确定哈。。。
主题帖子积分
Qter2级会员, 积分 141, 距离下一级还需 159 积分
Qter2级会员, 积分 141, 距离下一级还需 159 积分QT 信号槽用法
1.connect(ui-&menu_2, SIGNAL(triggered(QAction*)), this, SLOT(ActionCollectOnceTrigger(QAction*)));
这个信号槽连接可以知道菜单点击的是哪个action
2.connect(ui-&actionImport, SIGNAL(triggered()), this, SLOT(BatchImport()));
点击菜单中action 触发事件
3.connect(ui-&tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(showSelectedListItem()));
tableWidget某一记录被选择
4.connect(ui-&BatImport, SIGNAL(clicked()), this, SLOT(unknownMaterialImport()));
点击触发事件
5.connect(ui-&tableWidget1-&horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(mySort(int)));
tableWidget表头选中触发函数
6.connect(ui-&tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(rightClickAddLeftDown(QPoint)));
右击tableWidget
某行 出现菜单栏}

我要回帖

更多关于 qt 信号槽 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信