当前位置: 首页 PyQt5控件基类QWidget 自定义窗口演练鼠标和窗口事件
add-vip

自定义窗口演练鼠标和窗口事件

一、学习指导

这节课我们通过一个自定义窗口来实现鼠标事件和窗口事件的演练,课程中也增加了一些QObject中的方法。案例要求是创建一个无边框的窗口,透明度为80%,而且窗口拥有放大,缩小和回复正常大小功能,最后还要支持鼠标拖动功能。这是一个总和案例,在定位、事件和尺寸控制上都很有讲究,所以要详细理解。

二、代码演示

from PyQt5.Qt import *
import sys
'''
1.设计一个无边框,透明度为80%的窗口,能自由拖动
2.设计三个控件,最大化,最小化和关闭
'''
class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setWindowOpacity(0.9)  # 半透明,必须是浮点型
        self.setWindowTitle('窗口案例')
        self.resize(600, 450)
        self.mouse_press = False
        # self.move(300, 300)
        self.btn_w = 50
        self.btn_x = 20
        self.func_list()

    def func_list(self):
        self.btn()

    def btn(self):
        # 添加最大化、最小化和关闭按钮
        self.close_btn = QPushButton(self)
        self.close_btn.setText('关闭')
        self.close_btn.resize(self.btn_w, self.btn_x)

        self.max_btn = QPushButton(self)
        # max_btn.setText('最大化')
        self.max_btn.resize(self.btn_w, self.btn_x)

        self.min_btn = QPushButton(self)
        self.min_btn.setText('最小化')
        self.min_btn.resize(self.btn_w, self.btn_x)

        self.close_btn.pressed.connect(self.close)

        def max_signal():
            if self.isMaximized():
                self.showNormal()
                self.max_btn.setText('最大化')
            else:
                self.showMaximized()
                self.max_btn.setText('恢复')
        self.max_btn.pressed.connect(max_signal)

        self.min_btn.pressed.connect(self.showMinimized)

    def resizeEvent(self, QResizeEvent):
        self.close_btn.move(self.width() - 50, 2)
        self.max_btn.move(self.width() - 100, 2)
        self.min_btn.move(self.width() - 150, 2)

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.LeftButton:
            self.mouse_press = True      # 需要在属性中先定义为False
            self.win_x = self.x()
            self.win_y = self.y()
            self.m_x = QMouseEvent.globalX()
            self.m_y = QMouseEvent.globalY()
            # 1.创建一个标记,用来判定鼠标只有在按下之后才能移动
            # 2.窗口的原始坐标
            # 3.鼠标按下的坐标

    def mouseMoveEvent(self, QMouseEvent):
        if self.mouse_press:
            move_x = QMouseEvent.globalX()
            move_y = QMouseEvent.globalY()
            xx = move_x - self.m_x
            yy = move_y - self.m_y
            self.move(self.win_x + xx , self.win_y + yy)
        # if 窗口标记 == True:
            # 2.根据鼠标按下的点计算移动量
            # 3.根据移动量和窗口的原始坐标得到新坐标
            # 4.移动窗口位置

    def mouseReleaseEvent(self, QMouseEvent):
        self.mouse_press = False
        # 1.把mousePressEvent中创建的标记重置为False

app = QApplication(sys.argv)
window = Window()


window.show()
sys.exit(app.exec_())


# 创建一个无边框窗口,透明度设置为80%
# 自定义最大化、最小化和关闭按钮
# 支持拖拽功能


相关文章