前面几篇记录了PyQt5中的事件机制,这里用三个小案例来运用所学的知识。

鼠标事件案例

要求:

  • 创建一个窗口,包含一个标签
  • 当鼠标进入标签的时候,展示”欢迎光临“
  • 当鼠标离开标签的时候,展示”谢谢惠顾“
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class Mylabel(QLabel):
    def enterEvent(self, *args, **kwargs):
        print("鼠标进入")
        self.setText("欢迎光临")

    def leaveEvent(self, *args, **kwargs):
        print("鼠标离开")
        self.setText("谢谢惠顾")


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("鼠标操作的案例1")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 创建其他控件
label = Mylabel(window)
label.resize(200, 200)
label.move(100, 100)
label.setStyleSheet("background-color: cyan;")

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

运行效果

键盘事件案例

创建一个窗口,监听用户按键:

  • 监听用户输入Tab键
  • 监听用户Ctrl+S组合键
  • 监听用户Ctrl+Shift+A组合键

补充知识:修饰键和普通键

所谓的修饰键一般是用来辅助或者是用来进行一些快捷操作的。就类似于电脑的ctrl c 和ctrl v。就是按下之后不会显示实际的表达那种叫做修饰。

  • Qt.NoModifier : 没有修饰键
  • Qt.ShiftModifier : Shift键被按下
  • Qt.ControlModifier :Ctrl被按下
  • Qt.AltModifier : Alt键被按下
  • ...
  • 多个修饰键之间使用或运算

普通键就是在文本框中按下有相应的展现,例如按下Tab键会出现一个制表位,按下“1”键,文本框中会出现数字1。在Qt中,用Qt.Key_按下的键,例如Qt.Key_TabQt.Key_A

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class Window(QWidget):
    # 监听按下Tab键
    def keyPressEvent(self, evt):
        if evt.key() == Qt.Key_Tab:
            print("用户按下了Tab键")
            self.setStyleSheet("background-color: cyan;")

        # 监听 Ctrl+S
        if evt.modifiers() == Qt.ControlModifier and evt.key() == Qt.Key_S:
            print("用户按下了Tab键")
            self.setStyleSheet("background-color: yellow;")

        # 监听 Ctrl+Shift+A
        if evt.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and evt.key() == Qt.Key_A:
            print("Ctrl+Shift+A")
            self.setStyleSheet("background-color: red;")


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = Window()
window.setWindowTitle("鼠标操作的案例1")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

为了观察效果,特地修改了颜色。

用户区支持拖拽案例

完成窗口,用户区支持拖拽:鼠标点击了用户区拖拽也可以移动窗口。

一般窗口只能点击标题栏进行拖动,现在要求点击用户区就能拖动窗口。

拖拽的示意图

逻辑关系:

0.确定两个点:黄色的点是鼠标点击的点(拖拽的起点),绿色的点是窗口的左上角的点。

1.然后按剪头方向进行拖拽,黑色的点就是拖拽终点。确定鼠标移动的距离,箭头所代表的向量

2.原始的窗口坐标点 + 向量

这里需要考虑这个向量是如何计算的?是相对于窗口还是相对于桌面呢?答案是相对于桌面:

移动矢量的计算

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("窗口移动的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        pass

    def mousePressEvent(self, evt):
        #  确定两个点的位置(鼠标第一次按下的点以及窗口当前所在的原始点)

        #  mouse_X和mouse_Y是鼠标按下的点,相对于整个桌面而言
        self.mouse_X = evt.globalX()
        self.mouse_Y = evt.globalY()
        print(self.mouse_X, self.mouse_Y)

        # 窗口左上角的点位置
        self.origin_x = self.x()
        self.origin_y = self.y()

    def mouseMoveEvent(self, evt):
        print(evt.globalX(), evt.globalY())

        # 窗口移动实时的点坐标,最新的位置
        move_x = evt.globalX() - self.mouse_X
        move_y = evt.globalY() - self.mouse_Y
        print(move_x, move_y)

        # 目标点
        des_x = self.origin_x + move_x
        des_y = self.origin_y + move_y
        self.move(des_x, des_y)


    def mouseReleaseEvent(self, QMouseEvent):
        print("鼠标释放")




# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

需要注意,此处别搞鼠标跟踪,会导致崩溃。设置了鼠标跟踪之后,即使不按做左键,也要移动。

可以通过设置一个标志位来解决:

需要注意的是在mouseReleaseEvent中需要写上self.move_flag = False,不然在松开鼠标的时候仍然是True,会一直黏着。

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.move_flag = False
        self.setWindowTitle("窗口移动的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        pass

    def mousePressEvent(self, evt):
        self.move_flag = True
        #  确定两个点的位置(鼠标第一次按下的点以及窗口当前所在的原始点)

        #  mouse_X和mouse_Y是鼠标按下的点,相对于整个桌面而言
        self.mouse_X = evt.globalX()
        self.mouse_Y = evt.globalY()
        print(self.mouse_X, self.mouse_Y)

        # 窗口左上角的点位置
        self.origin_x = self.x()
        self.origin_y = self.y()

    def mouseMoveEvent(self, evt):
        if self.move_flag:
            print(evt.globalX(), evt.globalY())

            # 窗口移动实时的点坐标,最新的位置
            move_x = evt.globalX() - self.mouse_X
            move_y = evt.globalY() - self.mouse_Y
            print(move_x, move_y)

            # 目标点
            des_x = self.origin_x + move_x
            des_y = self.origin_y + move_y
            self.move(des_x, des_y)

    def mouseReleaseEvent(self, QMouseEvent):
        print("鼠标释放")
        self.move_flag = False


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.setMouseTracking(True)  # 设置了鼠标跟踪
    window.show()
    sys.exit(app.exec_())

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/pyqteventExample.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 07 月 16 日
如果觉得我的文章对你有用,请随意赞赏