首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PyQT5事件和信号

PyQT5事件和信号

作者头像
TomatoCool
发布2023-07-30 17:36:30
发布2023-07-30 17:36:30
4250
举报
文章被收录于专栏:TomatoCoolTomatoCool

#无特殊注明,所有案例只修改第一个案例的对应部分

Signals & slots:

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


#  继承QWidget,用户界面的基本控件,提供了基本的应用构造器
#  默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)
class Example(QWidget):

    #  继承父类构造
    def __init__(self):
        super().__init__()

        #  使用initUI()方法创建一个GUI
        self.initUI()

    #  初始化组件
    def initUI(self):
        #  创建一个LCD屏幕和水平滑块
        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)
        #  创建一个垂直布局,并将组件添加进去
        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)
        #  将垂直布局放入窗口
        self.setLayout(vbox)
        #  将sld的值与lcd的屏幕绑定
        sld.valueChanged.connect(lcd.display)
        #  不注释了
        self.setGeometry(300, 300, 300, 250)
        self.setWindowTitle('Signal and slot')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    #  进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
    sys.exit(app.exec_())

重构事件处理器:

代码语言:javascript
复制
#  初始化组件
def initUI(self):
    #  不注释了
    self.setGeometry(300, 300, 300, 250)
    self.setWindowTitle('Event handler')
    self.show()

#  重写事件处理器函数
def keyPressEvent(self, e):
    #  按下Esc键关闭程序
    if e.key() == Qt.Key_Escape:
        self.close()

事件对象:

代码语言:javascript
复制
#  初始化组件
def initUI(self):
    #  创建一个QGridLayout实例
    grid = QGridLayout()
    grid.setSpacing(10)
    #  初始化x,y
    x = 0
    y = 0
    #  创建一个标签显示x,y的值
    self.text = "x: {0},  y: {1}".format(x, y)
    self.label = QLabel(self.text, self)
    #  将标签加入grid
    grid.addWidget(self.label, 0, 0, Qt.AlignTop)
    #  事件追踪默认没有开启,当开启后才会追踪鼠标的点击事件
    self.setMouseTracking(True)
    #  将QGridLayout实例放到窗口里
    self.setLayout(grid)
    #  不注释了
    self.setGeometry(300, 300, 300, 250)
    self.setWindowTitle('Event object')
    self.show()

#  e代表了事件对象,里面有我们触发事件(鼠标移动)的事件对象
def mouseMoveEvent(self, e):
    #  获取鼠标的坐标
    x = e.x()
    y = e.y()
    #  更新text和label的值
    text = "x: {0},  y: {1}".format(x, y)
    self.label.setText(text)

事件发送:

这里使用的是QMainWindow

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class Example(QMainWindow):

    #  继承父类构造
    def __init__(self):
        super().__init__()

        #  使用initUI()方法创建一个GUI
        self.initUI()

    #  初始化组件
    def initUI(self):
        #  按钮1
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)
        #  按钮2
        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
        #  绑定自定义函数
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)
        #  状态栏
        self.statusBar()
        #  不注释了
        self.setGeometry(300, 300, 300, 250)
        self.setWindowTitle('Event sender')
        self.show()

    #  自定义按钮点击函数
    def buttonClicked(self):
        #  调用sender()方法的方式决定了事件源
        sender = self.sender()
        #  显示事件源的text值+str
        self.statusBar().showMessage(sender.text() + ' was pressed')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    #  进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
    sys.exit(app.exec_())


#  自定义按钮点击函数
def buttonClicked(self):
    #  调用sender()方法的方式决定了事件源
    sender = self.sender()
    #  显示事件源的text值+str
    self.statusBar().showMessage(sender.text() + ' was pressed')

信号发送:

QObject实例能发送事件信号,下面的例子是发送自定义的信号

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


#  Communicate类创建了一个pyqtSignal()属性的信号
class Communicate(QObject):
    closeApp = pyqtSignal()


class Example(QMainWindow):
    #不注释了
    def __init__(self):
        super().__init__()
        self.initUI()

    #  初始化组件
    def initUI(self):
        #  closeApp信号QMainWindow的close()方法绑定
        self.c = Communicate()
        self.c.closeApp.connect(self.close)
        #  不注释了
        self.setGeometry(300, 300, 300, 250)
        self.setWindowTitle('Emit signal')
        self.show()

    #  点击窗口的时候,发送closeApp信号,程序终止
    def mousePressEvent(self, event):
        self.c.closeApp.emit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    #  进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
    sys.exit(app.exec_())
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Signals & slots:
  • 重构事件处理器:
  • 事件对象:
  • 事件发送:
  • 信号发送:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档