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

Posted Trouvaille

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.8 自定义窗口演练鼠标和窗口事件相关的知识,希望对你有一定的参考价值。

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

1.案例功能

  • 通过一个自定义窗口来实现鼠标事件和窗口事件的演练,课程中也增加了一些QObject中的方法。案例要求是创建一个无边框的窗口,透明度为80%,而且窗口拥有放大,缩小和回复正常大小功能,最后还要支持鼠标拖动功能。这是一个总和案例

2.代码

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, 500)   #边框
        self.mouse_press = False
        # self.move(300, 300)
        self.btn_w = 60
        self.btn_h = 30
        self.func_list()

    def func_list(self) :
        self.btn()

    def btn(self) :
        # 2添加最大化、最小化和关闭按钮
        self.close_btn = QPushButton(self)
        self.close_btn.setText(\'关闭\')
        self.close_btn.resize(self.btn_w, self.btn_h) #传递宽和高
        #self.close_btn.move(self.width()-self.btn_w,2)#窗口宽度-控件宽度(x轴宽度)2(y轴宽度)随意给的



        self.max_btn = QPushButton(self)
        self.max_btn.setText(\'最大化\')
        self.max_btn.resize(self.btn_w, self.btn_h)
        #self.max_btn.move(self.width() - self.btn_w * 2, 2)#需要减去两个

        self.min_btn = QPushButton(self)
        self.min_btn.setText(\'最小化\')
        self.min_btn.resize(self.btn_w, self.btn_h)
        #self.min_btn.move(self.width() - self.btn_w * 3, 2)

        self.close_btn.pressed.connect(self.close) #关闭功能 用信号pressed连接槽函数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() - self.btn_w, 2)
        self.max_btn.move(self.width() - self.btn_w*2, 2)
        self.min_btn.move(self.width() - self.btn_w*3, 2)


    # 1.创建一个标记,用来判定鼠标只有在按下之后才能移动
    # 2.窗口的原始坐标
    # 3.鼠标按下的坐标
    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()


    # if 窗口标记 == True:
    # 2.根据鼠标按下的点计算移动量
    # 3.根据移动量和窗口的原始坐标得到新坐标
    # 4.移动窗口位置
    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)  #窗口坐标+变化量=最新位置

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


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

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

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

3.演示效果

以上是关于4.8 自定义窗口演练鼠标和窗口事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在子窗口小部件下使用 eventfilter 来捕获自定义事件

QT自定义窗口

鼠标事件 滚轮事件

PyQt5 无边框窗口重新定义鼠标事件

PyQt5 无边框窗口重新定义鼠标事件

Qt自定义界面边框后,移动鼠标拖动界面,界面会拖到任务栏以下。。。如何解决?