PyQt5信号-槽机制
signal -> emit -> slot
signal.connect(slot)
signal.disconnect(slot)
信号 (singal) 可以连接无数多个槽 (slot),或者没有连接槽也没有问题,信号也可以连接其他的信号。
连接的基本语句形式如下: who.singal.connect(slot)
信号是 QObject 的一个属性。只有通过 connect方法连接起来,信号-槽机制就建立起来了。类似的信号还有 disconnect 方法和emit 方法。
disconnect 就是断开信号-槽机制,而 emit 就是激活信号。
信号都是类的一个属性,新的信号必须继承自 QObject,然后由 PyQt5.QtCore.pyqtSingal(在 pyqt4 下是 PyQt4.QtCore.pyqtSingal)方法创建,这个方法接受的参数中最重要的是 types 类型,比如 int, bool 之类的,你可以认为这是信号传递的参数类型,但实际传递这些参数值的是 emit 方法。然后槽实际上就是经过特殊封装的函数,这些函数当然需要接受一些参数或者不接受参数,而这些参数具体的值传进来的是由 emit 方法执行的,然后我们通过 who.singal.connect(slot) 这样的形式将某个信号和某个槽连接起来, who 的信号,然后信号类自带的连接方法,然后连接到 slot 某个函数上,在这里隐藏的一个重要细节就是 emit 方法,比如说你定义一个新的信号,需要将点击屏幕的具体 x,y 坐标发送出去,内置的信号-槽将这一机制都完成了,如果你自己定义的信号和槽的话,比如 pyqtSingal(int,int) ,发送给 func(x,y),具体 x 和 y 的值你需要通过 emit(x,y) 来发送。至于什么时候发送,已经发送的 x,y 值的获取,这应该又是另外一个信号-槽机制的细节。
1. 自定义信号
from PyQt5.QtCore import *
from PyQt5.QtGui import * class FindDialog(QDialog):
findNext = pyqtSignal(str, Qt.CaseSensitivity)
findPrevious = pyqtSignal(str, Qt.CaseSensitivity)
2. 自定义槽
class FindDialog(QDialog):
......
@pyqtSlot()
def findClicked(self):
text = self.lineEdit.text()
if self.caseCheckBox.isChecked():
cs = Qt.CaseSensitive
else:
cs = Qt.CaseInsensitive
if self.backwardCheckBox.isChecked():
self.findPrevious.emit(text, cs)
else:
self.findNext.emit(text, cs)
3. 发射信号
class FindDialog(QDialog):
...... @pyqtSlot()
def findClicked(self):
......
if self.backwardCheckBox.isChecked():
self.findPrevious.emit(text, cs)
else:
self.findNext.emit(text, cs)
4. 以下是完整的示例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
查找对话框示例, 自定义信号槽
''' from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import * class FindDialog(QDialog):
findNext = pyqtSignal(str, Qt.CaseSensitivity)
findPrevious = pyqtSignal(str, Qt.CaseSensitivity) def __init__(self, parent = None):
super().__init__(parent)
label = QLabel(self.tr('Find &what:'))
self.lineEdit = QLineEdit()
label.setBuddy(self.lineEdit)
self.caseCheckBox = QCheckBox(self.tr('Match &case'))
self.backwardCheckBox = QCheckBox(self.tr('Search &backward'))
self.findButton = QPushButton(self.tr('&Find'))
self.findButton.setDefault(True)
self.findButton.setEnabled(False)
closeButton = QPushButton(self.tr('Close'))
self.lineEdit.textChanged.connect(self.enableFindButton)
self.findButton.clicked.connect(self.findClicked)
closeButton.clicked.connect(self.close)
topLeftLayout = QHBoxLayout()
topLeftLayout.addWidget(label)
topLeftLayout.addWidget(self.lineEdit)
leftLayout = QVBoxLayout()
leftLayout.addLayout(topLeftLayout)
leftLayout.addWidget(self.caseCheckBox)
leftLayout.addWidget(self.backwardCheckBox)
rightLayout = QVBoxLayout()
rightLayout.addWidget(self.findButton)
rightLayout.addWidget(closeButton)
rightLayout.addStretch()
mainLayout = QHBoxLayout()
mainLayout.addLayout(leftLayout)
mainLayout.addLayout(rightLayout)
self.setLayout(mainLayout)
self.setWindowTitle(self.tr('Find'))
self.setFixedHeight(self.sizeHint().height()) def enableFindButton(self, text):
self.findButton.setEnabled(bool(text)) @pyqtSlot()
def findClicked(self):
text = self.lineEdit.text()
if self.caseCheckBox.isChecked():
cs = Qt.CaseSensitive
else:
cs = Qt.CaseInsensitive
if self.backwardCheckBox.isChecked():
self.findPrevious.emit(text, cs)
else:
self.findNext.emit(text, cs) if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
findDialog = FindDialog() def find(text, cs):
print('find:', text, 'cs', cs) def findp(text, cs):
print('findp:', text, 'cs', cs) findDialog.findNext.connect(find)
findDialog.findPrevious.connect(findp)
findDialog.show()
sys.exit(app.exec_())
d
PyQt5信号-槽机制的更多相关文章
- QT信号槽机制
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...
- C++11实现Qt的信号槽机制
概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...
- VJGUI消息设计-兼谈MFC、QT和信号/槽机制
星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- Qt开发之信号槽机制
一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- QT写hello world 以及信号槽机制
QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...
- 非Qt工程使用Qt的信号槽机制
非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...
- QT学习记录之理解信号槽机制
作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...
随机推荐
- 使用脚本卸载.net framework for mac
官方只提供了安装包,没提供卸载
- day36 类的三大特性---封装以及Property特性
目录 类的封装 如果真的要拿 类的property特性 setter & deleter 类属性用法 类与对象的绑定方法和非绑定方法 对象方法&类方法&静态方法 隐藏模块内的函 ...
- luoguP1725 琪露诺 单调队列
DP 方程:$f[i]=max(f[j])+v[i]$ 转移范围:$i-r<=j<=i-l$ 由此我们得知,每次只有 $[i-r,i-l]$ 部分的 $f$ 值对新更新的答案会有贡献. 故 ...
- 使用css设置border从中间向两边的颜色渐进效果
1.效果图,设置目录的右框线渐进效果 2.代码 .rightCont>div:nth-child(1){ width: 370px; height: 100%; border-right: 2p ...
- Git server出现cache大回收分析
实例 git server是一个io密集型的服务,当cache量很大的时候,cache会全部一次释放,导致那么一瞬间,IO read压力很大,因为,用户的大量请求,需要重新从磁盘读到内存,但是这个时刻 ...
- codeforces 466B Wonder Room(思维,暴力)
题目 参考了别人的博客,百度来的博客 #include<iostream> #include<string> #include<stdio.h> #include& ...
- php第十一节课
增删改查 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- [jzoj5791]【NOIP2008模拟】阶乘 (数学)
传送门 Description 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. Input 共两行. 第一行一个正整数n. 第二行n个正 ...
- SVN仓库导入文件
分两种: 1.导入文件版本库从0开始 (适合新项目) 2.将其他SVN服务器中的版本库导入进来,版本库继承原SVN服务器的(适合SVN版本库迁移) 第一种: #mkdir –p /home/code/ ...