当前位置:   article > 正文

上位机开发---PyQt5_pyqt5上位机开发

pyqt5上位机开发

一、PyQt简介&环境搭建

1. PyQt简介

PyQt是一套Python的GUI开发框架,即图形用户界面开发框架.

Python中经常使用的GUI控件集有PyQt、Tkinter、wxPython、Kivy、PyGUI和Libavg

其中PyQt是Qt(c++语言实现的)为Python专门提供的扩展

1.1 Qt

Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面开发框架。
2008年,Qt Company被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。
2012年,Qt被Digia收购。
2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布

1.2 PyQt

  • 基础高性能的Qt的图形界面控件集
  • 能够跨平台运行在windows、linux和macos等系统上
  • 使用信号/槽(signal/slot)机制进行通信(其它语言采用回调方式)
  • 对Qt库的完全封装

1.3 通过pip安装PyQt5

  • pip install PyQt5 安装PyQt5
  • pip install PyQt5-tools 安装Qt工具软件
  • pip install PyQt5-stubs 安装PyQt5语法检测包(可选)

如果安装缓慢,请配置pip源:

pip config set global.index-url https://mirror.baidu.com/pypi/simple 

 二、PyQt创建窗口

1. 第一个PyQt窗口

  1. from PyQt5.QtWidgets import QApplication,QWidget
  2. import sys
  3. # 1.创建应用程序
  4. app = QApplication(sys.argv)
  5. # 2.创建窗口
  6. w = QWidget()
  7. # 3.显示窗口
  8. w.show()
  9. # 4.等待窗口停止
  10. sys.exit(app.exec())

执行代码,就会显示PyQt5窗口:

2. PyQt模块简介

PyQt中有非常多的功能模块,开发中最常用的功能模块主要有三个:

  • QtCore:包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
  • QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类
  • QtWidgets:包含了一些列创建桌面应用的UI元素

3. 窗口标题和图标

应用程序图标是一个小的图像,通常在标题栏的左上角显示。

  1. from PyQt5.QtWidgets import QApplication,QWidget
  2. from PyQt5.QtGui import QIcon
  3. import sys
  4. # 1.创建应用程序
  5. app = QApplication(sys.argv)
  6. # 2.创建窗口
  7. w = QWidget()
  8. # 设置窗口标题
  9. w.setWindowTitle('窗口')
  10. # 设置窗口尺寸
  11. w.resize(400, 300)
  12. # 设置图标
  13. w.setWindowIcon(QIcon('qq.png'))
  14. w.setToolTip('这个一个气泡提示')
  15. # 3.显示窗口
  16. w.show()
  17. # 4.等待窗口停止
  18. sys.exit(app.exec())

三、PyQt文本和图片

1. 文本控件

文本控件是QLabel

  1. from PyQt5.QtWidgets import QWidget, QApplication, QLabel
  2. import sys
  3. # 1.创建应用程序
  4. app = QApplication(sys.argv)
  5. # 2.创建窗口
  6. w = QWidget()
  7. # 修改窗口标题
  8. w.setWindowTitle('文本展示')
  9. label = QLabel()
  10. label.setText('第一个文本')
  11. # 将文本控件添加到窗口中
  12. label.setParent(w)
  13. # 3.显示窗口
  14. w.show()
  15. # 4.等待窗口停止
  16. sys.exit(app.exec())

2. 图片控件

QLabel 控件既可以显示文本,也可以显示图片

  1. from PyQt5.QtWidgets import QWidget, QApplication, QLabel
  2. from PyQt5.QtGui import QPixmap
  3. import sys
  4. def init_widget(w: QWidget):
  5. # 修改窗口标题
  6. w.setWindowTitle('图片展示')
  7. # 展示图片
  8. label = QLabel()
  9. pixmap = QPixmap('img.png')
  10. label.setPixmap(pixmap)
  11. # 显示到窗口中
  12. label.setParent(w)
  13. # 改变窗口大小
  14. w.resize(pixmap.width(), pixmap.height())
  15. if __name__ == '__main__':
  16. # 1.创建应用程序
  17. app = QApplication(sys.argv)
  18. # 2.创建窗口
  19. w = QWidget()
  20. init_widget(w)
  21. # 3.显示窗口
  22. w.show()
  23. # 4.等待窗口停止
  24. sys.exit(app.exec())

 四、PyQt输入框

1. 单行文本输入框

QLineEdit控件可以输入单行文本

  1. from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. def init_widget(w: QWidget):
  6. # 修改窗口标题
  7. w.setWindowTitle('单行输入框')
  8. # 设置窗口大小
  9. w.resize(480, 320)
  10. layout = QVBoxLayout()
  11. # 展示单行输入框
  12. edit = QLineEdit()
  13. # 设置输入框提示
  14. edit.setPlaceholderText('请输入用户名')
  15. # 设置文本
  16. edit.setText('张三')
  17. # 获取单选框的文字
  18. text = edit.text()
  19. print(text)
  20. # 设置输入框最大字符数
  21. edit.setMaxLength(10)
  22. layout.addWidget(edit)
  23. edit3 = QLineEdit("Password")
  24. edit3.setPlaceholderText('请输入密码')
  25. edit3.setEchoMode(QLineEdit.Password)
  26. layout.addWidget(edit3)
  27. w.setLayout(layout)
  28. if __name__ == '__main__':
  29. # 1.创建应用程序
  30. app = QApplication(sys.argv)
  31. # 2.创建窗口
  32. w = QWidget()
  33. init_widget(w)
  34. # 3.显示窗口
  35. w.show()
  36. # 4.等待窗口停止
  37. sys.exit(app.exec())

QLineEdit的方法

方法

说明

setEchoMode()

QLineEdit.Normal正常显示所输入的字符,默认选项

QLineEdit.NoEcho不显示任何输入的字符,常用于密码类型的输入,且其密码长度需要保密时

QLineEdit.Password显示与平台相关的密码掩码字符,而不是实际输入的字符

QLineEdit.PasswordEchoOnEdit在编辑时显示字符,负责显示密码类型的输入

setPlaceholderText()

设置文本框浮显文字

setText()

设置文本框内容

setMaxLength()

设置文本框所允许输入的最大字符数

2. 多行文本输入框 

QTextEdit控件用来输入多行文本

  1. from PyQt5.QtWidgets import QApplication,QWidget,QTextEdit
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('多行输入框')
  11. # 多行输入框
  12. edit = QTextEdit()
  13. # 设置提示内容
  14. edit.setPlaceholderText('请输入发表的内容')
  15. # 设置文本内容
  16. edit.setPlainText('武汉疫情')
  17. # 获取输入的内容
  18. print(edit.toPlainText())
  19. edit.clear()
  20. # 显示多行输入框
  21. edit.setParent(w)
  22. # 3.显示窗口
  23. w.show()
  24. # 4.等待窗口停止
  25. sys.exit(app.exec())

QTextEdit的方法

方法

说明

setPlainText()

设置多行文本框的文本内容

toPlainText()

返回多行文本框的文本内容

setHtml()

设置多行文本框的内容为HTML文档

toHtml()

返回多行文本框的HTML文档内容

clear()

清空多行文本框的内容

 五、PyQt按钮

常见的按钮实现类包括:QPushButtonQRadioButtonQCheckBox

QPushButton是最普通的按钮控件,可以响应一些用户的事件

  1. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
  2. import sys
  3. def func():
  4. print("按下按钮啦,火箭发射!")
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('普通按钮')
  11. # 显示普通按钮
  12. btn = QPushButton()
  13. # 添加按钮提示
  14. btn.setText('发射')
  15. # 给按钮添加点击事件
  16. btn.clicked.connect(func)
  17. # 展示按钮
  18. btn.setParent(w)
  19. # 3.显示窗口
  20. w.show()
  21. # 4.等待窗口停止
  22. sys.exit(app.exec())

六、PyQt信号和槽

1. 信号和槽简介

信号和槽机制是 QT 的核心机制,应用于对象之间的通信

  • 信号和槽是用来在对象间传递数据的方法
  • 当一个特定事件发生的时候,signal会被emit出来,slot调用是用来响应相应的signal
  • Qt中对象已经包含了许多预定义的 signal(基本组件都有各自特有的预定义的信号)
  • 槽函数绑定了信号,信号一旦发出,就会自动调用绑定的槽函数

2. 信号和槽绑定

通过调用 QObject 对象的 connect 函数来将对象的信号与另外一个对象的槽函数相关联,当发射者发射信号时,接收者的槽函数将被调用

点击按钮,输出hello

  1. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
  2. import sys
  3. # 槽函数
  4. def click():
  5. print('hello1')
  6. # 1.创建应用程序
  7. app = QApplication(sys.argv)
  8. # 2.创建窗口
  9. w = QWidget()
  10. # 修改窗口标题
  11. w.setWindowTitle('信号和槽的绑定')
  12. # 添加按钮
  13. btn = QPushButton()
  14. btn.setText('点我')
  15. btn.setParent(w)
  16. # 绑定按钮点击的信号和处理的槽函数
  17. # 方式1:槽函数使用函数
  18. # clicked 信号
  19. # click定义的槽函数
  20. btn.clicked.connect(click)
  21. # 方式2:槽函数使用lambda表达式
  22. # 信号和槽函数参数必须要保持一致
  23. # 如果信号中参数有= 槽函数可以不用添加
  24. btn.clicked.connect(lambda: print('hello2'))
  25. # 3.显示窗口
  26. w.show()
  27. # 4.等待窗口停止
  28. sys.exit(app.exec())

3. 使用PyQt的槽函数

利用系统自带退出函数QApplication.quit点击按钮,关闭窗口

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('使用系统的槽函数')
  11. # 创建按钮
  12. btn = QPushButton()
  13. btn.setText('关闭窗口')
  14. # 显示按钮
  15. btn.setParent(w)
  16. # 信号和槽绑定
  17. btn.clicked.connect(QApplication.quit) # 使用QApplication的quit方法
  18. # 3.显示窗口
  19. w.show()
  20. # 4.等待窗口停止
  21. sys.exit(app.exec())

七、PyQt布局layout 

1. 水平布局QHBoxLayout

  1. from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('水平布局')
  11. """------------------ 创建按钮 ------------------"""
  12. btn1 = QPushButton('1')
  13. btn2 = QPushButton('2')
  14. btn3 = QPushButton('3')
  15. btn4 = QPushButton('4')
  16. btn5 = QPushButton('5')
  17. # 创建布局
  18. layout = QHBoxLayout()
  19. # 添加布局到窗口中
  20. w.setLayout(layout)
  21. # 按钮控件添加到布局中
  22. layout.addWidget(btn1)
  23. layout.addWidget(btn2)
  24. layout.addWidget(btn3)
  25. layout.addWidget(btn4)
  26. layout.addWidget(btn5)
  27. # 3.显示窗口
  28. w.show()
  29. # 4.等待窗口停止
  30. sys.exit(app.exec())

2. 竖直布局QVBoxLayout

  1. from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QVBoxLayout
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('竖直布局')
  11. w.resize(480, 240)
  12. """------------------ 创建并添加5个按钮 ------------------"""
  13. # 创建布局
  14. layout = QVBoxLayout()
  15. # 布局添加到窗口中
  16. w.setLayout(layout)
  17. # 控件添加到布局中
  18. layout.addWidget(QPushButton('1'))
  19. layout.addWidget(QPushButton('2'))
  20. layout.addWidget(QPushButton('3'))
  21. layout.addWidget(QPushButton('4'))
  22. layout.addWidget(QPushButton('5'))
  23. # 3.显示窗口
  24. w.show()
  25. # 4.等待窗口停止
  26. sys.exit(app.exec())

3. 表单布局QFormLayout

  1. from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QFormLayout, QPushButton
  2. import sys
  3. def func():
  4. name = nameEdit.text()
  5. age = ageEdit.text()
  6. phone = phoneEdit.text()
  7. print("姓名:{} 年龄:{} 电话:{}".format(name, age, phone))
  8. # 1.创建应用程序
  9. app = QApplication(sys.argv)
  10. # 2.创建窗口
  11. w = QWidget()
  12. # w.resize(480, 320)
  13. # 修改窗口标题
  14. w.setWindowTitle('表单布局')
  15. """------------------ 创建布局 ------------------"""
  16. layout = QFormLayout()
  17. # 添加到窗口中
  18. w.setLayout(layout)
  19. # 输入框
  20. nameEdit = QLineEdit()
  21. ageEdit = QLineEdit()
  22. phoneEdit = QLineEdit()
  23. btn = QPushButton('发送')
  24. # 信号和槽绑定
  25. btn.clicked.connect(func)
  26. # 添加到布局中
  27. layout.addRow('姓名', nameEdit)
  28. layout.addRow('年纪', ageEdit)
  29. layout.addRow('电话', phoneEdit)
  30. layout.addRow('', btn)
  31. # 3.显示窗口
  32. w.show()
  33. # 4.等待窗口停止
  34. sys.exit(app.exec())

4. 布局嵌套

通过布局嵌套可以实现更加复杂的布局

  1. from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout,QVBoxLayout,QFormLayout
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. # 1.创建应用程序
  6. app = QApplication(sys.argv)
  7. # 2.创建窗口
  8. w = QWidget()
  9. # 修改窗口标题
  10. w.setWindowTitle('嵌套布局')
  11. """------------------ 实现布局 ------------------"""
  12. # 整体水平布局
  13. wholeLayout = QHBoxLayout()
  14. # 添加整体布局
  15. w.setLayout(wholeLayout)
  16. # 每一部分布局
  17. layout1 = QHBoxLayout()
  18. layout2 = QVBoxLayout()
  19. layout3 = QVBoxLayout()
  20. # 添加到整体的布局中
  21. wholeLayout.addLayout(layout1)
  22. wholeLayout.addLayout(layout2)
  23. wholeLayout.addLayout(layout3)
  24. # 控件
  25. # 添加第一部分控件
  26. layout1.addWidget(QPushButton('1'))
  27. layout1.addWidget(QPushButton('2'))
  28. # 添加第二部分控件
  29. layout2.addWidget(QPushButton('3'))
  30. layout2.addWidget(QPushButton('4'))
  31. # 添加第三部分控件
  32. layout3.addWidget(QPushButton('5'))
  33. layout3.addWidget(QPushButton('6'))
  34. layout3.addWidget(QPushButton('7'))
  35. # 3.显示窗口
  36. w.show()
  37. # 4.等待窗口停止
  38. sys.exit(app.exec())

八、PyQt单选框和复选框

1. 单选框

QRadioButton是单选按钮,它提供了一组可供选择的按钮和文本标签,用户可以选择其中一个选项

单选框选中的信号是:toggled

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. import sys
  4. def func(checked):
  5. '''
  6. 状态变化的槽函数
  7. :param checked: 是否被选中
  8. :return:
  9. '''
  10. print('状态变化', checked)
  11. # 1.创建应用程序
  12. app = QApplication(sys.argv)
  13. # 2.创建窗口
  14. w = QWidget()
  15. # 修改窗口标题
  16. w.setWindowTitle('单选框')
  17. """------------------ 创建布局 ------------------"""
  18. layout = QHBoxLayout()
  19. # 添加布局到窗口中
  20. w.setLayout(layout)
  21. # 创建两个单选框
  22. rb1 = QRadioButton('男')
  23. rb2 = QRadioButton('女')
  24. rb1.setChecked(True)
  25. # 添加到布局中
  26. layout.addWidget(rb1)
  27. layout.addWidget(rb2)
  28. # 绑定信号和槽
  29. rb1.toggled.connect(func)
  30. # 3.显示窗口
  31. w.show()
  32. # 4.等待窗口停止
  33. sys.exit(app.exec())

2. 复选框

QCheckBox提供了一组带文本标签的复选框,用户可以选择多个选项

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. import sys
  5. def func(state):
  6. # 判断是否选中
  7. if state == Qt.Checked: # 2
  8. print('选中')
  9. else: # 0
  10. print('未选中')
  11. # 1.创建应用程序
  12. app = QApplication(sys.argv)
  13. # 2.创建窗口
  14. w = QWidget()
  15. # 修改窗口标题
  16. w.setWindowTitle('复选框')
  17. """------------------ 窗口布局 ------------------"""
  18. layout = QHBoxLayout()
  19. # 添加到窗口中
  20. w.setLayout(layout)
  21. # 控件
  22. label = QLabel()
  23. label.setText('谦哥的爱好:')
  24. ck1 = QCheckBox('抽烟')
  25. ck2 = QCheckBox('喝酒')
  26. ck3 = QCheckBox('烫头')
  27. # 选中第一个
  28. ck1.setChecked(True)
  29. # 添加控件到布局中
  30. layout.addWidget(label)
  31. layout.addWidget(ck1)
  32. layout.addWidget(ck2)
  33. layout.addWidget(ck3)
  34. # 绑定信号和槽
  35. ck1.stateChanged.connect(func)
  36. # 3.显示窗口
  37. w.show()
  38. # 4.等待窗口停止
  39. sys.exit(app.exec())

九、PyQt对话框

对话框是为了更好地实现人与程序的交互
对话框主要是完成特定场景下的功能,比如删除确认等

QDialog的子类有QMessageBoxQFileDialogQFontDialogQInputDialog

1. QMessageBox

QMessageBox是普通的对话框

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. def deleteUser():
  6. # 弹出对话框,让用户确认
  7. result = QMessageBox.question(w, '提示', '确认要删除好朋友吗?',
  8. QMessageBox.Ok | QMessageBox.Cancel,
  9. QMessageBox.Cancel)
  10. if result == QMessageBox.Ok:
  11. print('确认删除')
  12. elif result == QMessageBox.Cancel:
  13. print('取消删除')
  14. # 1.创建应用程序
  15. app = QApplication(sys.argv)
  16. # 2.创建窗口
  17. w = QWidget()
  18. # 修改窗口标题
  19. w.setWindowTitle('对话框')
  20. """------------------ 创建按钮 ------------------"""
  21. btn = QPushButton('删除用户')
  22. # 显示控件
  23. btn.setParent(w)
  24. # 信号和槽绑定
  25. btn.clicked.connect(deleteUser)
  26. # 3.显示窗口
  27. w.show()
  28. # 4.等待窗口停止
  29. sys.exit(app.exec())

2. QIputDialog

QIputDialog是输入对话框,由一个文本框和两个按钮(OK按钮和Cancel按钮)组成

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import QIcon
  4. import sys
  5. def func():
  6. str,success = QInputDialog.getText(w,'提示','请输入角色名称')
  7. if success:
  8. edit.setText(str)
  9. # 1.创建应用程序
  10. app = QApplication(sys.argv)
  11. # 2.创建窗口
  12. w = QWidget()
  13. # 修改窗口标题
  14. w.setWindowTitle('输入提示框')
  15. """------------------ 创建界面 ------------------"""
  16. layout = QHBoxLayout()
  17. # 添加布局
  18. w.setLayout(layout)
  19. # 控件
  20. btn = QPushButton('创建角色')
  21. edit = QLineEdit()
  22. # 控件添加到布局中
  23. layout.addWidget(btn)
  24. layout.addWidget(edit)
  25. # 信号和槽函数绑定
  26. btn.clicked.connect(func)
  27. # 3.显示窗口
  28. w.show()
  29. # 4.等待窗口停止
  30. sys.exit(app.exec())

十、PyQt面向对象

Qt窗口继承

写一个自定义类继承QWidget

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. import sys
  5. class MyWindow(QWidget):
  6. def __init__(self, title):
  7. super().__init__()
  8. self.setWindowTitle(title)
  9. if __name__ == '__main__':
  10. app = QApplication(sys.argv)
  11. window = MyWindow("窗口标题")
  12. window.show()
  13. sys.exit(app.exec_())

通过继承QWidget来实现窗体

在构造中,必须调用super函数,否则将出行错误

初始化ui

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. import sys
  5. class MyWindow(QWidget):
  6. def __init__(self, title):
  7. super().__init__()
  8. self.setWindowTitle(title)
  9. self.init_ui()
  10. def init_ui(self):
  11. layout = QHBoxLayout()
  12. # ---------------------------------
  13. # 在这里初始化界面内容
  14. # ---------------------------------
  15. self.setLayout(layout)
  16. if __name__ == '__main__':
  17. app = QApplication(sys.argv)
  18. window = MyWindow("窗口标题")
  19. window.show()
  20. sys.exit(app.exec_())

十一、PyQt自定义信号和槽

1. 为什么要使用信号和槽

使用信号和槽的好处在于,可以将代码分离成更小的、更可重用的部分,从而提高代码的可读性和可维护性。这种机制使得不同的对象之间可以进行通信,而不需要它们之间直接相互调用方法。

如果直接调用函数,会导致代码的紧密耦合,不利于代码的维护和扩展。此外,使用信号和槽也可以方便地实现多线程编程,因为它们可以在不同的线程之间进行通信。

使用信号和槽的目的:

  • 用于代码之间的解耦合
  • 子线程通知主线程更新界面

2. 在文件内部定义信号和槽

PyQt中自定义信号和槽的步骤如下:

  1. 定义信号:在类中定义一个信号,使用PyQt的信号机制可以实现自定义信号。可以通过pyqtSignal()方法来创建一个信号对象。pyqtSignal参数槽函数的参数类型
  2. 定义槽:在类中定义一个槽函数,使用@pyqtSlot()装饰器将该方法注册为槽函数。
  3. 连接信号和槽:使用信号.connect(槽函数)方法将信号和槽连接起来。
  4. 触发信号:在需要触发信号的地方,使用信号.emit()方法来触发该信号,参数和槽函数参数一致。
  1. from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject
  2. class MyObject(QObject):
  3. # a. 定义一个自定义信号
  4. my_signal = pyqtSignal(str)
  5. # b. 定义一个槽函数
  6. @pyqtSlot(str)
  7. def my_slot(self, message):
  8. print("Received message: ", message)
  9. # 创建一个对象
  10. obj = MyObject()
  11. # b. 连接信号和槽
  12. obj.my_signal.connect(obj.my_slot)
  13. # c. 触发信号
  14. obj.my_signal.emit("Hello, World!")

首先定义了一个名为my_signal的自定义信号。然后,我们定义了一个名为my_slot的槽函数,并使用@pyqtSlot()装饰器将其注册为槽函数。最后,我们创建了一个MyObject对象,并将my_signal信号连接到my_slot槽函数。最后,我们通过调用emit()方法来触发该信号,并将消息传递给槽函数。 

3. 在不同文件定义信号和槽

当在不同的类中连接信号和槽时,需要使用QObject.connect()方法来建立连接。假设我们有两个类SenderReceiver,其中Sender类定义了一个信号my_signalReceiver类定义了一个槽函数my_slot,那么连接过程如下:

  1. from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
  2. class Sender(QObject):
  3. my_signal = pyqtSignal(str)
  4. def send_data(self):
  5. data = "Hello, World!"
  6. self.my_signal.emit(data)
  7. class Receiver(QObject):
  8. @pyqtSlot(str)
  9. def my_slot(self, data):
  10. print("Received data: ", data)
  11. sender = Sender()
  12. receiver = Receiver()
  13. # 将信号连接到槽
  14. sender.my_signal.connect(receiver.my_slot)
  15. # 触发信号
  16. sender.send_data()

创建了两个类SenderReceiver,并分别实例化了它们的对象senderreceiver。然后,我们使用connect()方法将Sender类中的信号my_signal连接到了Receiver类中的槽函数my_slot。最后,我们通过调用send_data()方法来触发信号,从而使得槽函数被调用,并输出接收到的数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/663105
推荐阅读
相关标签
  

闽ICP备14008679号