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

源码

蓝奏云:PySide6实战汇总

密码:adro

从上一章开始看

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

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

改变后的ui

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

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

布局

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

代码

上一章已经讲过怎么把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):
        # globalPosition为鼠标位置 , pos,position 为窗口的位置 , cursor_win_pos 为鼠标在窗口中的位置

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

            # 右下角边界拉伸事件
            elif self.cursor_win_pos.x() > self.ui.frame.size().width() and self.cursor_win_pos.y() > self.ui.frame.size().height():
                self._corner_drag = True
                event.accept()

            # 下边界拉伸事件
            elif self.cursor_win_pos.x() < self.ui.frame.size().width() and self.cursor_win_pos.y() > self.ui.frame.size().height():
                self._bottom_drag = True
                event.accept()

            # 右边界拉伸事件
            elif self.cursor_win_pos.x() > self.ui.frame.size().width() and self.cursor_win_pos.y() < self.ui.frame.size().height():
                self._right_drag = True
                event.accept()

    # 鼠标移动所执行的功能
    def mouseMoveEvent(self, event):
        # 移动事件
        if Qt.LeftButton and self._move_drag:
            m_Point = event.globalPosition() - self.cursor_win_pos
            self.move(m_Point.x() ,m_Point.y())
            event.accept()

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

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

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

        # 获取鼠标在窗口中的位置来改变鼠标的图标
        # 右下角边界光标事件
        self.cursor_win_pos = event.globalPosition() - self.pos()
        if self.cursor_win_pos.x() > self.ui.frame.size().width() and self.cursor_win_pos.y() > self.ui.frame.size().height():
            self.setCursor(Qt.SizeFDiagCursor)
        # 下边界光标事件
        elif self.cursor_win_pos.x() < self.ui.frame.size().width() and self.cursor_win_pos.y() > self.ui.frame.size().height():
            self.setCursor(Qt.SizeVerCursor)
        # 右边界光标事件
        elif self.cursor_win_pos.x() > self.ui.frame.size().width() and self.cursor_win_pos.y() < self.ui.frame.size().height():
            self.setCursor(Qt.SizeHorCursor)
        # 正常光标事件
        else:
            self.setCursor(Qt.ArrowCursor)

    # 鼠标弹起后,恢复各扳机的状态
    def mouseReleaseEvent(self, event):
        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())

效果

下期预告

下一期为:设置系统托盘

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现无边框界面的自由缩,可以通过以下步骤: 1. 在 PySide2 中创建一个窗口,设置窗口的 flags 参数为 QtCore.Qt.FramelessWindowHint,这样就可以去掉窗口边框。 2. 在窗口中添加一个 QWidget 作为主界面,设置其 layout 为 QHBoxLayout 或者 QVBoxLayout,这样就可以自动调整内部控件的位置和大小。 3. 使用鼠标事件来实现窗口的移动和缩放。例如,通过重写 QWidget 的 mousePressEvent、mouseMoveEvent、mouseReleaseEvent 方法来实现拖动窗口的功能,通过重写 QWidget 的 resizeEvent 方法来实现窗口缩放的功能。 4. 在鼠标事件中判断鼠标的位置,以便实现不同的功能。例如,当鼠标位于窗口的边缘时,就可以实现窗口的缩放;当鼠标位于窗口的标题栏时,就可以实现窗口的移动。 示例代码: ```python from PySide2 import QtCore, QtGui, QtWidgets class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__(None, QtCore.Qt.FramelessWindowHint) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Tool | QtCore.Qt.X11BypassWindowManagerHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.widget = QtWidgets.QWidget(self) self.widget_layout = QtWidgets.QVBoxLayout(self.widget) self.widget_layout.setContentsMargins(0, 0, 0, 0) self.label = QtWidgets.QLabel(self.widget) self.label.setText("Hello World!") self.label.setAlignment(QtCore.Qt.AlignCenter) self.widget_layout.addWidget(self.label) self.setCentralWidget(self.widget) def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: self.mouse_pos = event.pos() event.accept() def mouseMoveEvent(self, event): if event.buttons() == QtCore.Qt.LeftButton: self.move(self.pos() + event.pos() - self.mouse_pos) event.accept() def resizeEvent(self, event): self.widget.resize(self.size()) event.accept() ``` 在这个例子中,我们创建了一个无边框窗口,并且添加了一个 QLabel 控件来显示文字。我们实现了鼠标事件来实现窗口的移动和缩放,同时利用 QVBoxLayout 来自动调整控件的位置和大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值