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信号-槽机制的更多相关文章

  1. QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...

  2. C++11实现Qt的信号槽机制

    概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...

  3. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  4. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  5. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...

  6. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  7. QT写hello world 以及信号槽机制

    QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...

  8. 非Qt工程使用Qt的信号槽机制

    非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...

  9. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

随机推荐

  1. 1、Scala安装与基础

    1.scala与java 2.安装 3.scala编译器 4.变量声明 5.数据类型 6.操作符 7.函数调用 8.apply函数 1.scala与java scala基于java虚拟机,所有scal ...

  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

    http://www.cnblogs.com/wuhuacong/p/3872890.html 我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起 ...

  3. C++泛型 && Java泛型实现机制

    C++泛型  C++泛型跟虚函数的运行时多态机制不同,泛型支持的静态多态,当类型信息可得的时候,利用编译期多态能够获得最大的效率和灵活性.当具体的类型信息不可得,就必须诉诸运行期多态了,即虚函数支持的 ...

  4. 用了那么多项目管理工具,还是CORNERSTONE这款最好用

    在与软件开发有关的项目,往往会出现很难管理情况.许多事情都需提前计划.控制与管理,所以许多项目经理很容易迷失在计划的过程中.幸运的是,市场上提供了各种各样的项目管理工具.但不幸的是,工具实在是太多了. ...

  5. spring IOC 装配一个bean

    1.0属性注入 新建一个people类 package com.java.test3; /** * @author nidegui * @create 2019-06-22 14:45 */ publ ...

  6. 在 CentOS 7 上设置 grub2

    在 CentOS 7 上设置 grub2 1. 开机选单是自动创建出来的 请勿尝试手动编辑开机选单,因为它是按照 /boot/ 目录内的文件自动创建出来的.然而你可以调整 /etc/default/g ...

  7. html第六节课

    JavaScript 一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系 ...

  8. python中字节与字符串的转换

    #bytes object    byte = b"byte example"     # str object    str = "str example" ...

  9. em与当前元素的不解之缘

    em是相对于当前元素的字体大小而言,比如font-size:14px;那么这个元素的1em=14px. 如果当前元素未定义字体大小,则会向上继承父元素的字体大小,如果当前元素的所有祖先元素都没有定义f ...

  10. Educational Codeforces Round 35 B/C/D

    B. Two Cakes 传送门:http://codeforces.com/contest/911/problem/B 本题是一个数学问题. 有a个Ⅰ类球,b个Ⅱ类球:有n个盒子.将球放入盒子中,要 ...