PyQT5:信号和槽

信号和槽

Qt的主要特征之一是它使用信号和插槽在对象之间进行通信。

当潜在的事件发生时,会发出一个信号。插槽是可调用的Python,如果将信号连接到插槽,则在发出信号时将调用该插槽。如果没有连接信号,则什么也不会发生。

信号/插槽机制具有以下功能。

  1. 信号可能连接到许多插槽。
  2. 一个信号也可以连接到另一个信号。
  3. 信号参数可以是任何Python类型。
  4. 插槽可以连接到许多信号。
  5. 连接可以是直接的(同步的)或排队的(异步的)。
  6. 可以跨线程进行连接。
  7. 信号可能断开。

信号(特别是未绑定的信号)是类属性。当信号被引用为该类的实例的属性时,PyQt5会自动将该实例绑定到该信号,以创建绑定信号。这与Python本身用于从类函数创建绑定方法的机制相同。

一个绑定信号具有connect(),disconnect()和emit()实现相关联的功能的方法。它还具有一个signal属性,该属性是将由Qt的SIGNAL() 宏返回的信号的签名。

5种不同的信号

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ParaTrans.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import random
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtWidgets import * class Ui_MainWindow(QWidget):
signal1 = pyqtSignal(str)
signal2 = pyqtSignal(int, str)
signal3 = pyqtSignal(list)
signal4 = pyqtSignal(dict)
signal5 = pyqtSignal([int, str], [str]) def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 800)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit.setGeometry(QtCore.QRect(240, 150, 500, 500))
self.plainTextEdit.setObjectName("plainTextEdit")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(20, 140, 200, 400))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout.addWidget(self.pushButton_2)
self.pushButton_3 = QtWidgets.QPushButton(self.widget)
self.pushButton_3.setObjectName("pushButton_3")
self.verticalLayout.addWidget(self.pushButton_3)
self.pushButton_4 = QtWidgets.QPushButton(self.widget)
self.pushButton_4.setObjectName("pushButton_4")
self.verticalLayout.addWidget(self.pushButton_4)
self.pushButton_5 = QtWidgets.QPushButton(self.widget)
self.pushButton_5.setObjectName("pushButton_5")
#信号和槽
self.pushButton.clicked.connect(self.mysignal1)
self.signal1.connect(self.mySlotFunc1)
self.pushButton_2.clicked.connect(self.mysignal2)
self.signal2.connect(self.mySlotFunc2)
self.pushButton_3.clicked.connect(self.mysignal3)
self.signal3.connect(self.mySlotFunc3)
self.pushButton_4.clicked.connect(self.mysignal4)
self.signal4.connect(self.mySlotFunc4)
self.pushButton_5.clicked.connect(self.mysignal5)
self.signal5[int, str].connect(self.mySlotFunc5_1)
self.signal5[str].connect(self.mySlotFunc5_2) self.verticalLayout.addWidget(self.pushButton_5)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow) def mysignal1(self):
self.signal1.emit("测试str类型") def mysignal2(self):
self.signal2.emit(123456, " 测试int+str类型") def mysignal3(self):
list = [1,2,3,4,5,6,7,8,9]
self.signal3.emit(list) def mysignal4(self):
dic = {"北京":"beijing","上海":"shanghai","广州":"guangzhou","深圳":"shenzhen"}
self.signal4.emit(dic)
#([int, str], [str])
# 声明一个重载版本的信号,也就是槽函数的参数可以是int和str类型,也可以只有一个str类型的参数 def mysignal5(self):
flag = random.random() < 0.5
if flag == True:
self.signal5[int, str].emit(999, "重载参数类型:[int, str]")
elif flag == False:
self.signal5[str].emit("重载参数类型:[str]") #######################
def mySlotFunc1(self,val):
self.plainTextEdit.setPlainText(val)
print("hello") def mySlotFunc2(self,intval,text):
content = str(intval)+text
self.plainTextEdit.setPlainText(content) def mySlotFunc3(self,list):
print(str(list))
self.plainTextEdit.setPlainText(str(list)) def mySlotFunc4(self,dic):
self.plainTextEdit.setPlainText(str(dic)) def mySlotFunc5_1(self, val1, val2):
self.plainTextEdit.setPlainText(str(val1)+val2) def mySlotFunc5_2(self, val):
self.plainTextEdit.setPlainText(str(val)) def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "str测试"))
self.pushButton_2.setText(_translate("MainWindow", "str int测试"))
self.pushButton_3.setText(_translate("MainWindow", "list测试"))
self.pushButton_4.setText(_translate("MainWindow", "dict测试"))
self.pushButton_5.setText(_translate("MainWindow", "重载信号测试")) if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
Ui = Ui_MainWindow()
# 向主窗口上添加控件
Ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

PyQT5:信号和槽的更多相关文章

  1. [ PyQt入门教程 ] PyQt5信号与槽

    信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...

  2. pyqt5信号与槽2

    信号和槽与类的属性和方法在层次上是相同的,同属与一个类的特征. 信号的定义由工厂函数生成: signal=PyQt5.QtCore.pyqtSignal(types[, name[, result[, ...

  3. PyQt5信号与槽详解

    1.信号与槽函数基础'''信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行'''from PyQt5.QtWidgets import *import sys class signal(Q ...

  4. PyQt5信号与槽关联的两种方式

    目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...

  5. PyQt5信号与槽

    简单使用 可以使用designer的一个模式定义,也可以自己定义,在__init__函数里,self.btn.clicked.connect(self.text.clear). 注意:槽不用加括号,可 ...

  6. PyQt5中的信号与槽,js 与 Qt 对象之间互相调用

    一.PyQt中的信号与槽 信号(Signal)和槽(Slot)是Qt中的核心机制,用在对象之间互相通信.在Qt中每个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject ...

  7. 五、Pyqt5事件、信号和槽

    PyQt中提供了两种针对事件处理的机制:一种是事件,另一种则是信号和槽. 一.事件 事件处理在PyQt中是比较底层的,常用的事件有键盘事件.鼠标事件.拖放事件.滚轮事件.定时事件.焦点事件.进入和离开 ...

  8. PyQt5(3)——信号和槽初探

    信号和槽是QT的核心机制(当信号发射时,链接的槽函数会自动执行) 在pyqt5中信号和槽通过 QObject.signal.connect()链接. QObject类或子类(QWidget)派生的类都 ...

  9. PyQt5信号-槽机制

    signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slo ...

随机推荐

  1. 基于单机redis的分布式锁实现

    最近我们有个服务经常出现存储的数据出现重复,首先上一个系统流程图: 用户通过http请求可以通知任务中心结束掉自己发送的任务,这时候任务中心会通过MQ通知结束服务去结束任务保存数据,由于任务结束数据计 ...

  2. open jdk 绿色版 下载

    https://adoptopenjdk.net/ 是 rethat 的 openjdk 地址, jdk 11 , 进入页面后搜索 : jdk_x64_windo , 下载 zip 绿色版的那个. h ...

  3. PHP imap 远程命令执行漏洞(CVE-2018-19518)

    影响版本 PHP:5.6.38 系统:Debian/ubuntu 构造数据包 成功执行命令echo '1234567890'>/tmp/test0001

  4. Magento 2.2 SQL注入漏洞

    影响版本 2.2.* poc地址  https://github.com/ambionics/magento-exploits python3 magento-sqli.py http://192.1 ...

  5. 记一次 .NET 某智慧水厂API 非托管内存泄漏分析

    一:背景 1. 讲故事 七月底的时候有位朋友在wx上找到我,说他的程序内存占用8G,托管才占用1.5G,询问剩下的内存哪里去了?截图如下: 从求助内容看,这位朋友真的太客气了,动不动就谈钱,真伤感情, ...

  6. 如何根治慢SQL?

    本文摘自:CodeSheep 今天和大家聊一个常见的问题:慢SQL. 包括以下内容: 慢SQL的危害 SQL语句的执行过程 存储引擎和索引的那些事儿 慢SQL解决之道 后续均以MySQL默认存储引擎I ...

  7. Android 已发行多年,移动 App 已经趋近饱和,那么 Android 开发还会有那么吃香吗?

    一.关于Android的前景 不断地也听见很多人在谈做Android是否还有前途.Android研发在走下坡路了.Android的工作太难找了.Android是不是已经凉了...... 对于这些其实我 ...

  8. Ivy入门笔记

    安装过程 命令行安装 下载和安装JDK5.Eclipse3.5.Ant 1.8.Ivy 2.2: 安装JDK:成功标志:在命令行下运行java命令,得到java命令行帮助: 安装Ant:解压Ant,在 ...

  9. React Native 启动流程简析

    导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程. 工程创建步骤可以参考官网.本文所分析 React Native 版本为 v ...

  10. Nginx搭建与相关配置

    目录 一.Nginx简介 1.1 概述 1.2 Nginx与Apache的差异 二.编译安装Nginx服务 2.1 将nginx软件包传到主机/opt目录下 2.2.安装依赖包 2.3.添加模块编译安 ...