QT学习小结之信号与槽

信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧。

信号槽机制是Qt编程的基础。通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯。

槽函数和普通的C++成员函数没有很大的区别。它们也可以使virtual的;可以被重写;可以使public、protected或者private的;可以由其它的C++函数调用;参数可以是任何类型的。如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用。

信号与槽函数的连接我们可以用connect函数:

connect(sender,SIGNAL(signal()),receive,SLOT(slot()));

需要注意的几点问题:

1、一个信号可以和多个槽相连(槽函数被调用的顺序是随机的)

connect(sender,SIGNAL(signal()),this,SLOT(slot_1()));connect(sender,SIGNAL(signal()),this,SLOT(slot_2()));

2、多个信号可以连接同一个槽函数

connect(sender,SIGNAL(signal_1()),this,SLOT(slot()));connect(sender,SIGNAL(signal_2()),this,SLOT(slot()));

3、一个信号可以连接另外一个信号

connect(sender,SIGNAL(signal_1()),this,SIGNAL(signal_2()));

4、信号与槽函数之间的连接可以被取消

disconnect(sender,SIGNAL(signal()),this,SLOT(slot()));

5、信号与槽函数的参数个数、类型以及出现顺序必须一致,另外,当信号的参数个数多于槽函数时,信号多出的参数将会被忽略掉

connect(sender,SIGNAL(signal(int,const Qstring &)),this,SLOT(slot(int b,const Qstring &)));connect(sender,SIGNAL(signal(int,const  Qstring &)),this,SLOT(slot(int)));//此时const  Qstring &将会被忽略

6、宏定义不能用在signal和slot的参数中

7、函数指针不能作为信号与槽函数的参数,同时信号与槽函数也不能有缺省参数

8、友元声明不能位于信号或槽函数声明区内

9、信号与槽不能携带模板类参数

10、嵌套的类不能位于信号与槽函数区域内,也不能有信号或者槽函数

在使用信号与槽机制的时候,要注意避免陷入死循环,即在槽函数中再次发送所接收到的信号。

时间: 2024-10-24 22:28:44

QT学习小结之信号与槽的相关文章

Qt on Android: Qt Quick 事件处理之信号与槽

前面两篇文章< Qt on Android:QML 语言基础>和<Qt on Android: Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简单的 Qt Quick 应用了.接下来呢,哈,我们要介绍 Qt Quick 中一个灰常灰常重要的主题:事件处理.这将是比较长长长长的一篇,哦,不还有后续好几篇--废话少说,还是谈正事儿吧兄弟姐妹们. 本文参加 CSDN 博文大赛,请点这里投我一票,谢

2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)

本章主要内容如下: 1) 窗口组件(QWidget) 2) QT坐标系统 3) 消息处理(信号与槽) 介绍 Qt以组件对象的方式构建图形用户界面 Qt中没有父组件的顶级组件,则被叫做窗口 组件的类型分为: 容器类(父组件)  :  用于包含功能的界面组件 功能类(子组件)  :  用于实现特定的交互功能 如下图所示: 比如上面的QgroupBox ,即属于顶级组件的功能类(子组件),又是3个功能类组件的父组件(容器) 组件继承 Qt中所有窗口组件都继承于QWidget类,而QWidget类又继承

Qt 和 Boost关于信号和槽的对比说明

对比 无论是 Qt 的实现方式还是 Boost 的实现方式,除了必须的定义信号和槽的类之外,都不需要额外的类. 两种实现都解决了类爆炸的问题.下面让我们对照着来看一下我们前面的分析. 两个不同的术语以及各自的动作:信号和槽: 在一个地方(信号)可以连接零个或者多个回调函数(槽)同时也是多对多的,一对多,多对多: 焦点在于连接本身,而不是提供者或者消费者: 不需要手工为了一个连接创建新的类: 连接仍旧是类型安全的. 这五点是信号槽系统的核心,Qt 和 boost 都拥有这些特性. 下面则是二者的不

Qt杂记——布局、信号与槽

1.布局设置拉伸: ui->TopLayout->setStretch(0,1); //left ui->TopLayout->setStretch(1,4); //right 就是说横向布局之中有两个控件.那么根据初始化的顺序默认index为0,1,所以分别设置两个控件的拉伸比例,上述代码中即为1:4显示. 2.信号与槽注意事项: connect()中信号与槽函数若有参数只能写类型,不能带参数名字,如: connect(this,SIGNAL(itemClicked(QTreeW

QT学习之路---信号槽

#include<QApplication> #include<QPushButton> int main(int argc,char *argv[]) { QApplication a(argc,argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button,SIGNAL(clicked()),&a,SLOT(quit())); button->show(

Qt Quick 事件处理之信号与槽-2(代码备忘)

个人学习的代码来处来自:http://blog.csdn.net/foruok/article/details/30028711 1.  hello_world.qml 主要的功能是: 1. 是点击按钮,两个文本的颜色会随机变化,并输出"textFirst"的文本内容 2. 输出Text , Button , Image 三个对象的C++原型 1 import QtQuick 2.4 2 import QtQuick.Controls 1.3 3 4 Rectangle { 5 wid

QT学习小结之鼠标事件

qt鼠标事件所包含的头文件<QMouseEvent>,QMouseEvent中包含了两个坐标,一是全局坐标(globalPos()),即桌面坐标,这个跟Windows下的调用的getCursorPos函数得到的结果一致. 鼠标事件常见的有mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),下面我就贴上几段代码吧 void Event_test::mouseMoveEvent(QMouseE

C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽 -- 欢迎界面

程序运行先显示一个对话框,确定进入主程序 1.新建Qt工程,类MyWidget,基类QWidget 2.新建设计师界面类MyDialog,基类QDialog 3.-----main.cpp----- 1 #include "mywidget.h" 2 #include "mydialog.h" 3 #include <QApplication> 4 5 int main(int argc, char *argv[]) 6 { 7 QApplication

在Qt Creator 和在 vs2012 里添加信号和槽

Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了. 如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函数(在qt里称做槽slot)相连接 可以把信号理解为c#里的事件 在vs2012里和在Qt Creator里添加信号和槽不一样,这里把两种环境下怎么添加详细说明一下 1.在vs2012里添加信号和槽 新建一个qt的项目QtDemo 在qtdeom.h里添加槽 private slots: void Btn_O