PySide6入门教程之五 | 事件处理之鼠标与键盘事件

在这里插入图片描述


前言
在 PySide6 中处理鼠标事件和键盘事件是非常常见的需求。
要处理鼠标事件,你可以重载 mousePressEventmouseReleaseEventmouseMoveEvent 等事件处理方法。
处理键盘事件也很类似,你需要重载 keyPressEventkeyReleaseEvent 方法。


🚀🚀🚀 Pyside6实战教程专栏目录入口:点击跳转


一、前期准备

我们采用Pyside入门实战之四中通过QTDesigner创建的界面,具体由两个Label和一个Button组件构成(含背景),如下所示:
在这里插入图片描述

import sys
from PySide6.QtWidgets import QMainWindow, QApplication

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

二、处理鼠标事件

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6 import QtGui
from PySide6.QtCore import Qt

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        
		# 开启鼠标追踪
        self.setMouseTracking(True)  

    def mousePressEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.label.setText("点击了鼠标左键")

    def mouseMoveEvent(self, event: QtGui.QMouseEvent):
        self.label_2.setText(f"鼠标移动  x:{event.x()} y:{event.y()}")

    def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.label("释放了鼠标左键")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

2.1 隐藏窗口边框

很多人在制作自己的GUI界面时,往往会隐藏界面窗口默认的边框,以达到美观的效果。其功能实现非常简单,仅需要添加一行代码即可。

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6.QtCore import Qt

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 隐藏窗口边框
        self.setWindowFlags(Qt.FramelessWindowHint)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

在这里插入图片描述
这样就会出现一个问题GUI界面位置固定,鼠标无法拖动。那么就需要鼠标事件来实现拖动窗口的功能。

2.2 鼠标拖动窗口

核心代码:

def mousePressEvent(self, event: QtGui.QMouseEvent):
    if event.button() == Qt.LeftButton:
        self.mouse_start_pt = event.globalPosition().toPoint()
        self.window_pos = self.frameGeometry().topLeft()
        self.drag = True

def mouseMoveEvent(self, event: QtGui.QMouseEvent):
    if self.drag:
        distance = event.globalPosition().toPoint() - self.mouse_start_pt
        self.move(self.window_pos + distance)

def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
    if event.button() == Qt.LeftButton:
        self.drag = False

2.3 完整代码

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6 import QtGui
from PySide6.QtCore import Qt

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 隐藏窗口边框
        self.setWindowFlags(Qt.FramelessWindowHint)

    def mousePressEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.mouse_start_pt = event.globalPosition().toPoint()
            self.window_pos = self.frameGeometry().topLeft()
            self.drag = True

    def mouseMoveEvent(self, event: QtGui.QMouseEvent):
        if self.drag:
            distance = event.globalPosition().toPoint() - self.mouse_start_pt
            self.move(self.window_pos + distance)

    def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.drag = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

在这里插入图片描述

二、处理键盘事件

完成上述功能后,又一个新的问题抛出,我们将窗口边框隐藏后,那我们将如何关闭窗口呢?

我们当然可以使用Button触发close事件关闭窗口,代码如下:

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6 import QtGui
from PySide6.QtCore import Qt

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 隐藏窗口边框
        self.setWindowFlags(Qt.FramelessWindowHint)

        self.btn_1.setText("关闭窗口") # 修改按钮上的文字显示
        self.btn_1.clicked.connect(self.close) # 点击触发close事件

    def mousePressEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.mouse_start_pt = event.globalPosition().toPoint()
            self.window_pos = self.frameGeometry().topLeft()
            self.drag = True

    def mouseMoveEvent(self, event: QtGui.QMouseEvent):
        if self.drag:
            distance = event.globalPosition().toPoint() - self.mouse_start_pt
            self.move(self.window_pos + distance)

    def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.drag = False


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

核心代码即为这两行。其中btn_1为自定义按钮命名(根据自己命名更改)。

self.btn_1.setText("关闭窗口") # 修改按钮上的文字显示
self.btn_1.clicked.connect(self.close) # 点击触发close事件

当然你也可以自定义:

self.btn_1.clicked.connect(self.closeEvent) # 点击触发close事件
def closeEvent(self, event):
	# 写自己的代码
    sys.exit(0)

第二种方式就是采用键盘触发close事件关闭窗口。这里列举了分别按下ESC键和Enter回车键触发close窗口事件。

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6 import QtGui
from PySide6.QtCore import Qt

from ui_main import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 隐藏窗口边框
        self.setWindowFlags(Qt.FramelessWindowHint)

    def keyPressEvent(self, event: QtGui.QKeyEvent):
        key = event.key()

        if key == Qt.Key_Escape:
            self.close()
        elif key == Qt.Key_Enter or key == Qt.Key_Return:
            self.close()


    def mousePressEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.mouse_start_pt = event.globalPosition().toPoint()
            self.window_pos = self.frameGeometry().topLeft()
            self.drag = True

    def mouseMoveEvent(self, event: QtGui.QMouseEvent):
        if self.drag:
            distance = event.globalPosition().toPoint() - self.mouse_start_pt
            self.move(self.window_pos + distance)

    def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.drag = False


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w94ghz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值