Qt之信号与槽

有关这个概念网上有太多太多的资料了,这些资料也非常健全,比如下面这些文章,后两篇比较高端,现在还没完全整明白,感谢tingsking18大神

http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/

http://blog.csdn.net/tingsking18/article/details/4800828

http://blog.csdn.net/tingsking18/article/details/4991563



接下来就来谈谈自己碰到的一些注意事项,关于connect信号与槽的参数问题

1、信号与槽中的参数个数与类型必须完全一样,什么意思,看下面的代码,曾经的一个错误:

connect(button, SIGNAL(clicked()), this, SLOT(sendMessage(QString)));

本意是连接qpushbutton的clicked()信号与槽sendMessage(),其中槽有一个形参类型为QString,这样一切编译通过,可是调试的时候发现根本进不了槽函数,问题就出现在信号与槽函数的参数个数不一样。将上述代码改成connect(but, SIGNAL(clicked(QString)), this, SLOT(sendMessage(QString)));即可。注意这是Qt中的使用SIGNAL()和SLOT()的一个自身的缺陷,在编译时不会检查这种错误,只有在运行时才会在程序的输出窗口输出错误。我这里用的VS2010来调试,观察输出窗口,会发现输出了以下的错误:

QObject::connect: Incompatible sender/receiver arguments
MyButton::clickButton() --> onefloor::sendMessage(QString)

另外,参数类型必须完全一样,即信号参数为QString,槽参数也必须为QString,不能int对应QString。这就是信号与槽中的参数个数与类型必须完全一样的含义。

这个问题在Qt5中推荐使用一种更加安全的方法,下面再讨论

2、信号与槽函数中不能有形参名。还是看个错误的例子

connect(button, SIGNAL(config(QString abc)), this, SLOT(configAddr(QString str)));

还是一样,编译时不会报错,运行时在输出窗口时可以看到错误,最终的结果当然也是槽函数没有响应。



上面提到的Qt5中会推荐一种使用方法,可以避免信号与槽连接时运行时报错,不方便查找错误。

connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2);

针对第一个例子,也就是写成这样connect(button, &MyButton::clickButton, this, &onefloor::sendMessage);

这样,就可以再编译的时候检查信号与槽是否存在,并进行参数类型检查。

有关Qt5中connect的说明,可以参考以下两篇博客http://blog.csdn.net/dbzhang800/article/details/6547196 和 http://www.linuxidc.com/Linux/2014-04/100581.htm

时间: 2024-10-12 03:13:24

Qt之信号与槽的相关文章

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

Qt的信号与槽机制

1.信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解. 2.信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方. 3.信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码. 4.在我们所熟知的很多GUI工具包中,窗口小部件(widget

QT的信号和槽机制简介

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

qt中信号与槽机制

一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 信号 当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号.这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用. 槽 用于接收信号,而且槽只是普通的对象成员函数.一个槽并不知

QT的信号与槽机制介绍

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

【QT】信号和槽

信号和槽机制是QT对C++的拓展,只有QOBject的子类才具有这种功能. 支持信号和槽的类必须从QObject派生,并且用Q_OBJECT宏开始定义类. 信号和槽的意义在于:调用者和被调用者分离,实现高内聚,低耦合. 信号的定义: 在类中,用signals标识符表示. signal的声明和函数的声明格式是一样的,但是不需要实现. signal没有访问权限的概念,默认是protected. 槽函数的定义: 在类中,用slots来表示槽. 它可以设置访问权限. 他可以实现和普通函数一样. 它可以像

Qt认识信号与槽

一.概述 信号与槽机制是Qt的编程很常见用到的一种机制,他可以让应用程序的一个控件(比如:一个按钮)和对应的时间绑定在一起实现相应的功能 二.信号 什么是信号,比如我拿一根针扎我自己,这个时候神经就会发送一种电信号让我感到疼痛,在我点击一个按钮的时候,他需要发出一种信号,来告诉对应的控件,我要怎么怎么样的,你要干什么, 其实这个我们还可以理解成,在中国有一个故事是烽火戏诸侯想必大家都听说过吧,就是说我这里点了狼烟,我的诸侯国看到了就要派兵过来,我们这里可以理解成,我点狼烟的时候就是发送的一个信号

Qt学习--信号与槽(多窗口的实现)

按照helloword的创建过程 创建一个新的项目(项目名:window) 之后进行多窗口的实现过程: (参考:http://www.qter.org/portal.php?mod=view&aid=27&page=3) 第2篇 Qt5基础(二)编写Qt多窗口程序 三.添加登录对话框 1.往项目中添加新文件,这里可以在编辑模式左侧的项目目录上右击,然后选择添加新文件菜单,如下图所示.当然也可以在文件菜单中进行添加. <ignore_js_op> 2.模板选择Qt分类中的Qt设计

QT自定义信号和槽

最近项目中使用到QT,在此记录一下QT的核心,信号与槽: QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) sender:信号发出者 signal:发送信号 receiver:信号接收者 method:信号处理者 新建一个QT窗口,在窗口上放一个按