Qt学习之信号与槽(一)

目录

QT的信号与槽机制

在窗口的UI设计中操作添加信号和槽

QT的信号与槽机制  

QT的两种机制

在Qt和PyQt中有两种通信机制:

低级事件处理机制(low-level event-handling mechanism)

高级机制(high-level mechanism)

前者是大部分GUI通用的机制,后者是Qt独有机制,也就是信号和槽。
信号与槽会屏蔽底层细节。
什么是底层细节:比如是不需要知道是鼠标点击了按钮还是键盘操作了按钮,最后的结果都是按钮被点击,我们只需要去执行对应的动作(处理信号的为槽函数)。

信号与槽机制

信号(Signal)和槽(Slot)是Qt中核心机制,也是在Pyqt编程对象之间进行通信的机制。

所有从QObject类或其子类(如QWidget)派生的类都能够包含信号和槽。当对象改变其状态(比如点击按钮),信号就由该对象发射出去。槽用于接收信号,但它们是普通的对象成员函数。多个信号可以与单个槽进行连接,单个信号也
可以与多个槽进行连接,所以信号与槽构建了一种强大的控件编程机制。 在Qt编程中,通过Qt信号槽机制对鼠标或键盘在界面上的操作进行响应处理,例如对鼠标单击按钮的处理,Qt中的控件能够发射什么信号,以及在什么情况下发射信号,在Qt文档中有说明,不同的控件能够发射的信号种类和触发时机也是
不同的。在pyqt5编程中,信号与槽通过QObject.signal.connect()连接,这在后面手动连接信号和槽函数的时候会明说。

信号与槽机制示意图

这里我们要明白:

控件的状态发生改变会发射信号,信号要有槽函数去接收处理

所有控件支持信号与槽、预定义信号与槽

信号需要连接到槽,才能得到处理

控件触发后,直接发射出信号就不管了,接下来有没有动作,有没有相应的槽函数去处理,都是用户去处理信号

不同控件发射出的信号类型可能不同

PyQt槽函数,可以是任何可以调用的东西,没有特殊格式要求,而C++槽函数必须固定格式声明

Pyqt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号,信号与槽的特点

一个信号可以连接多个槽

一个信号可以连接另一个信号

信号参数可以是任何Python类型

一个槽可以监听多个信号

信号与槽连接方式可以是同步连接,也可以是异步连接

信号与槽的连接可能会跨线程

信号可能会断开

信号的类型

Qt型信号:Qt预设的信号
Python型信号:在PyQt中自定义的信号,PyQt中使用QObject.emit()方法自定义。
短路信号:没有参数的信号
非短路信号:含有参数的

在窗口的UI设计中操作添加信号和槽

现在我们知道信号与槽是怎么回事,那么应该如何使用这些信号与槽?

如何为控件发射的信号指定对应的处理槽函数

三种方法:
在窗口的UI设计中操作添加信号和槽
通过代码连接信号和槽
通过Eric的‘生成对话框代码’的功能产生信号与槽

在窗口的UI设计中操作添加信号和槽

步骤:
切换编辑模式到信号与槽模式
拖动连接
选择相应的槽函数

步骤1:切换编辑模式到信号与槽模式

单击工具栏里面的"编辑信号/槽"或者通过单击"Edit"(编辑)菜单--〉"编辑信号/槽",进入信号槽编辑模式。

连接信号和槽成功后,会发现在‘编辑信号/槽‘模式下,所创建的信号和槽关系的连线都是红色的。

步骤2:拖动连接

直接在发射者(控件)上按住鼠标左键不放,拖动到接收者(From窗体)上,这样就建立了连接。

步骤3:选择相应的槽函数

在左侧的按钮信号槽里面选择clicked()信号,在右侧的槽函数中选择close(),这意味着对‘关闭窗口’按钮单击会发射clicked信号,这个信号会被from窗体的槽函数close()捕捉到,并触发该窗体的close行为。

上面这个按钮的功能就是点击后关闭窗口

实现流程:按钮是信号发射者,当单击按钮之后会发射一个信号,通过这行代码程序内部的通信机制知道这个按钮的单击事件被连接到窗体的关闭事件上,然后通知接收者窗体,可以运行槽函数close()

我们也使用同样的方法给别的按钮进行处理

我们要知道这些槽函数的功能:

clear():清除文本内容
close():关闭窗口
deleteLater():
hide():隐藏窗口
lower():把文本内容第一个字母变成小写
raise():把文本内容第一个字母变成大写
repaint():再打印一边内容
setFocus():设置焦点
show():显示
showFullScreen():全屏显示窗口
showMaximized():最大化窗口
showMinimized():最小化窗口
showNormal():显示正常的窗口大小
update():更新

  

测试

怎么测试:https://www.cnblogs.com/-wenli/p/10335058.html

测试结果一切正常。

最后:

控件可以把信号发给其他控件,这里我们就可以尝试点击按钮,清空label标签的文本内容。

Qt学习之信号与槽(一)的更多相关文章

  1. qt学习:信号,槽

    [C.GUI.Qt.4编程(第二版)](加)布兰切特,(英)萨默菲尔德.扫描版[学习库www.xuexi111.com].pdf 信号和槽是Qt编程的基础,它可以让各种对象联系在一起. 1. 使用co ...

  2. 【QT学习】信号和槽机制

    QT中发射信号使用 emit 来完成. 类要使用信号和槽机制,必须从QObject或者QObject子类继承.必须在类的定义中加上 Q_OBJECT 宏. 信号和槽连接时,参数类型必须相同. 关键字大 ...

  3. Qt学习笔记----信号与槽实现的四种方式

    1.以按钮为例,首先添加一个按钮,对象名为pushButton,在按钮是右键单击选择“转到槽”即可,在转到槽选择面板(右图)里面选择需要进行的操作,比如单击clicked() 2.选择菜单“编辑”,找 ...

  4. Qt学习笔记 信号和槽

    槽和普通c++成员函数一样只可以为虚函数,也可以被重用,可以是公有的也可以是私有的,也可以被其它的c++函数调用; 参数也是任意的 唯一不同的是本槽和信号是可以连在一起的,和c#的事件差不多.相连后每 ...

  5. Qt入门之信号与槽机制

    一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...

  6. Qt中使用信号和槽的一点心得

    信号(Signal)与槽(Slot)-Qt中的典型机制 这一篇文章中都说得很详细了,这里不再重复,只说一点在实际使用中可能会遇到的问题. 1.一个信号不要同时连接几个槽函数,不然执行的顺序是随机的,最 ...

  7. Qt编程之信号与槽-------unresolved external symbol "public: virtual struct QMetaObject const * __thiscall XX::metaObject(void)const

    原因是加入Q_OBJECT这个macro的类,被编译的时候就要用到moc这个命令,所以在VS2010中,没有加入此命令的应用,当然会出错了.所以解决办法是加,或者如果你不使用信号槽可以直接删除. 当要 ...

  8. Qt 5中信号和槽的新语法

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  9. Qt之自定义信号和槽函数

    自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...

随机推荐

  1. rem,em

    任意浏览器的默认字体高都是16px.所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的body选择 ...

  2. Biorhythms HDU - 1370 (中国剩余定理)

    孙子定理: 当前存在三个式子,t%3=2,t%5=3,t%7=2.然后让你求出t的值的一个通解. 具体过程:选取3和5的一个公倍数t1能够使得这个公倍数t1%7==1,然后选取3和7的一个公倍数t2使 ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛 K题

    题目链接: https://nanti.jisuanke.com/t/31452 AC代码(看到不好推的定理就先打表!!!!): #include<bits/stdc++.h> using ...

  4. 自助Linux之问题诊断工具strace【转】

    转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  5. CSS选择器中带点(.)怎么办?

    在SharePoint中很多元素的ID都用点(.)来连接的,比如: <li class="ms-cui-group" id="Ribbon.Documents.Ed ...

  6. 转载:JAVA序列化与反序列化 (作者:YSOcean)

    原文:https://www.cnblogs.com/ysocean/p/6870069.html File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878 ...

  7. oracle 数据库链路

    Oracle数据库链路的建立和使用 一.数据库链路的建立: 1.数据库链路的建立语法一般是:CREATE DATABASE LINK[db_link_name] CONNECT TO [user_na ...

  8. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题

    raspberry pi买回来玩了一段时间,现在就记录一下入门遇到的一些问题吧. 首先是烧写镜像,和安装电脑系统是一样的道理. 先要有一个制作一个U启动盘.先将SD卡格式化,再用Win32DiskIm ...

  9. 淘淘商城 本地仓库配置和仓库jar包下载

    SVN服务器的搭建请查看该文:<Win7 x64 svn 服务器搭建> 1:仓库包存放位置: 2:setting.xml 文件配置信息 <?xml version="1.0 ...

  10. LeetCode(37): 每k个一组翻转链表

    Hard! 题目描述: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...