【PySide6】二、无边框拉伸窗口

源码

蓝奏云:https://wwbx.lanzoul.com/b037wmw7e

密码:adro

从上一章开始看

本章我们需要正在上一章的基础上来做调整,所以还没有看过上一章的朋友可以回头看看

【PySide6】一、无边框移动窗口

改变后的ui

在本章我们给ui加上了退出程序的按钮

并且做了简单的布局,拉伸功能必须对控件进行布局

【PySide6】二、无边框拉伸窗口_第1张图片

布局

各控件的属性设置,请自行在源码ui文件中查看

【PySide6】二、无边框拉伸窗口_第2张图片

代码

上一章已经讲过怎么把ui文件转化为py文件了,所以以后也不再说明

import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from ui import ui_main_win

# 主窗口
class main_win(QWidget):

    def __init__(self,parent = None):

        # 从文件中加载UI定义
        super(main_win, self).__init__(parent)
        self.ui = ui_main_win.Ui_Form()
        self.ui.setupUi(self)

        self.setWindowFlag(Qt.FramelessWindowHint)        #将界面设置为无框
        self.setAttribute(Qt.WA_TranslucentBackground)    #将界面属性设置为半透明
        self.shadow = QGraphicsDropShadowEffect()        #设定一个阴影,半径为 4,颜色为 2, 10, 25,偏移为 0,0
        self.shadow.setBlurRadius(4)
        self.shadow.setColor(QColor(2, 10, 25))
        self.shadow.setOffset(0, 0)
        self.ui.frame.setGraphicsEffect(self.shadow)    #为frame设定阴影效果

        # 绑定退出按钮信号
        self.ui.pushButton_2.clicked.connect(app.quit)

        # 开启鼠标跟踪后,鼠标离开窗口或进入窗口会触发 mouseMoveEvent 事件
        self.setMouseTracking(True)
        # 初始化各扳机的状态
        self.initDrag()
        # 主窗口绑定事件过滤器
        self.ui.frame.installEventFilter(self)  # 初始化事件过滤器


#   -------------------------------------------------事件过滤器-------------------------------------------------

    def eventFilter(self, obj, event):
        # 事件过滤器,用于解决鼠标进入其它控件后还原为标准鼠标样式
        if isinstance(event, QEnterEvent):
            self.setCursor(Qt.ArrowCursor)
        return super().eventFilter(obj, event)


#   -----------------------------------------------移动与拉伸功能------------------------------------------------

#   -----------------------------------------------移动与拉伸功能------------------------------------------------

    # 初始化各扳机的状态
    def initDrag(self):
        self._move_drag = False
        self._corner_drag = False
        self._bottom_drag = False
        self._right_drag = False

    # 鼠标按下所执行的功能
    def mousePressEvent(self, event):
        # globalPos为鼠标位置 , pos 为窗口的位置 , m_Position 为鼠标在窗口中的位置  .x() .y() 获取事件中的坐标

        # 移动事件
        if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() < self.ui.frame.size().height():
            self._move_drag = True
            self.m_Position = event.globalPos() - self.pos()
            event.accept()

        # 右下角边界拉伸事件
        if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() > self.ui.frame.size().height():
            self._corner_drag = True
            event.accept()

        # 下边界拉伸事件
        if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() > self.ui.frame.size().height():
            self._bottom_drag = True
            event.accept()

        # 右边界拉伸事件
        if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() < self.ui.frame.size().height():
            self._right_drag = True
            event.accept()

    # 鼠标移动所执行的功能
    def mouseMoveEvent(self, QMouseEvent):

        # 移动事件
        if Qt.LeftButton and self._move_drag:
            self.move(QMouseEvent.globalPos() - self.m_Position)
            QMouseEvent.accept()

        # 右下角边界拉伸事件
        if Qt.LeftButton and self._corner_drag:
            self.resize(QMouseEvent.pos().x()+10 , QMouseEvent.pos().y()+10)
            QMouseEvent.accept()

        # 下边界拉伸事件
        if Qt.LeftButton and self._bottom_drag:
            self.resize(self.width() , QMouseEvent.pos().y()+10)
            QMouseEvent.accept()

        # 右边界拉伸事件
        if Qt.LeftButton and self._right_drag:
            self.resize(QMouseEvent.pos().x()+10 , self.height())
            QMouseEvent.accept()

        # 获取鼠标在窗口中的位置来改变鼠标的图标
        # 右下角边界光标事件
        if (QMouseEvent.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() > self.ui.frame.size().height():
            self.setCursor(Qt.SizeFDiagCursor)

        # 下边界光标事件
        elif (QMouseEvent.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() > self.ui.frame.size().height():
            self.setCursor(Qt.SizeVerCursor)

        # 右边界光标事件
        elif (QMouseEvent.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() < self.ui.frame.size().height():
            self.setCursor(Qt.SizeHorCursor)
        # 正常光标事件
        else:
            self.setCursor(Qt.ArrowCursor)

    # 鼠标弹起后,恢复各扳机的状态
    def mouseReleaseEvent(self, QMouseEvent):
        self._move_drag = False
        self._corner_drag = False
        self._bottom_drag = False
        self._right_drag = False


if __name__ == '__main__':
    # 每一个 PySide6 应用都必须创建一个应用对象
    app = QApplication([])
    main_win = main_win()
    main_win.show()
    sys.exit(app.exec())

效果

【PySide6】二、无边框拉伸窗口_第3张图片

下期预告

下一期为:设置系统托盘

你可能感兴趣的:(python实战汇总,python)