自定义拖动范围【标题栏】——PyQT5

主要代码

    def mouseReleaseEvent(self, QMouseEvent):
        """
        重写继承的鼠标释放事件
        """
        self.mouse_state = False

    def mouseMoveEvent(self, event):
        """
        重写继承的鼠标拖动事件
        """
        # 鼠标按住左键,且在当前窗口的指定拖动范围内,才出发拖动。
        if self.mouse_range_state and self.mouse_state:
            # 获取鼠标拖动后,在当前窗口的坐标
            after_move_x = event.x()
            after_move_y = event.y()
            # 获取鼠标拖动后,在系统桌面的坐标
            desktop_x = self.frameGeometry().x()
            desktop_y = self.frameGeometry().y()
            # 移动窗口
            self.move(desktop_x + (after_move_x - self.before_move_x), desktop_y + (after_move_y - self.before_move_y))

    def mousePressEvent(self, event):
        """
        重写继承的鼠标释放事件【鼠标按下生效】
        """
        if event.button() == Qt.LeftButton:
            # 判断鼠标是否按下左键
            self.mouse_state = True
            # 自定义拖动区域的宽度
            custom_drag_range_width = 420
            # 自定义拖动区域的高度
            custom_drag_range_height = 40
            # 获取鼠标在当前窗口的坐标
            before_move_x = event.x()
            before_move_y = event.y()
            # 判断鼠标是否在指定的拖动范围内
            if before_move_x < custom_drag_range_width and before_move_y < custom_drag_range_height:
                self.mouse_range_state = True
                self.before_move_x = before_move_x
                self.before_move_y = before_move_y
            else:
                self.mouse_range_state = False

全部代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'tips.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(460, 220)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(0, 0, 460, 40))
        self.widget.setMinimumSize(QtCore.QSize(460, 40))
        self.widget.setMaximumSize(QtCore.QSize(460, 40))
        self.widget.setSizeIncrement(QtCore.QSize(460, 40))
        self.widget.setBaseSize(QtCore.QSize(460, 40))
        self.widget.setStyleSheet("background-color: #1464c8;")
        self.widget.setObjectName("widget")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setGeometry(QtCore.QRect(10, 0, 72, 40))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(255, 255, 255);")
        self.label.setObjectName("label")
        self.CloseButton = QtWidgets.QPushButton(self.widget)
        self.CloseButton.setEnabled(True)
        self.CloseButton.setGeometry(QtCore.QRect(420, 0, 40, 40))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(40)
        sizePolicy.setVerticalStretch(40)
        sizePolicy.setHeightForWidth(self.CloseButton.sizePolicy().hasHeightForWidth())
        self.CloseButton.setSizePolicy(sizePolicy)
        self.CloseButton.setMinimumSize(QtCore.QSize(40, 40))
        self.CloseButton.setMaximumSize(QtCore.QSize(40, 40))
        self.CloseButton.setSizeIncrement(QtCore.QSize(40, 40))
        self.CloseButton.setBaseSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(-1)
        font.setBold(True)
        font.setWeight(75)
        font.setKerning(True)
        self.CloseButton.setFont(font)
        self.CloseButton.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.CloseButton.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
        self.CloseButton.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.CloseButton.setStyleSheet("QPushButton{\n"
                                       "    color: rgb(255, 255, 255);\n"
                                       "    font-size:40px;\n"
                                       "    border:none;\n"
                                       "}\n"
                                       "QPushButton:hover{\n"
                                       "    background-color: rgb(67, 131, 211);\n"
                                       "    font-size:40px;\n"
                                       "}\n"
                                       "QPushButton:selected {\n"
                                       "    background-color: rgb(67, 131, 211);\n"
                                       "    font-size:40px;\n"
                                       "}\n"
                                       "")
        self.CloseButton.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../img/close.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.CloseButton.setIcon(icon)
        self.CloseButton.setIconSize(QtCore.QSize(40, 40))
        self.CloseButton.setCheckable(False)
        self.CloseButton.setAutoDefault(False)
        self.CloseButton.setObjectName("CloseButton")
        self.widget_2 = QtWidgets.QWidget(Form)
        self.widget_2.setGeometry(QtCore.QRect(0, 40, 460, 180))
        self.widget_2.setMinimumSize(QtCore.QSize(460, 180))
        self.widget_2.setMaximumSize(QtCore.QSize(460, 180))
        self.widget_2.setSizeIncrement(QtCore.QSize(460, 180))
        self.widget_2.setBaseSize(QtCore.QSize(460, 190))
        self.widget_2.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.widget_2.setObjectName("widget_2")
        self.tips = QtWidgets.QLabel(self.widget_2)
        self.tips.setGeometry(QtCore.QRect(70, 60, 300, 50))
        self.tips.setMinimumSize(QtCore.QSize(300, 50))
        self.tips.setMaximumSize(QtCore.QSize(300, 50))
        self.tips.setSizeIncrement(QtCore.QSize(300, 50))
        self.tips.setBaseSize(QtCore.QSize(350, 50))
        font = QtGui.QFont()
        font.setFamily("Microsoft JhengHei UI")
        font.setPointSize(15)
        font.setBold(True)
        font.setWeight(75)
        self.tips.setFont(font)
        self.tips.setObjectName("tips")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "Demo"))
        self.tips.setText(_translate("Form", "  自定义鼠标拖动范围示例"))


class MainWindow(QWidget, Ui_Form):
    def __init__(self):
        super(MainWindow, self).__init__()
        # 隐藏默认的标题栏
        self.setWindowFlags(Qt.FramelessWindowHint)
        # 设置主窗口的QWidget为透明
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.mouse_state = self.mouse_range_state = False
        self.setupUi(self)
        self.CloseButton.clicked.connect(lambda: self.close())

    def mouseReleaseEvent(self, QMouseEvent):
        """
        监听鼠标释放事件
        """
        self.mouse_state = False

    def mouseMoveEvent(self, event):
        """
        重写继承的鼠标释放事件【鼠标拖动生效】
        """
        # 鼠标按住左键,且在当前窗口的指定拖动范围内,即可出发拖动。
        if self.mouse_range_state and self.mouse_state:
            # 获取鼠标拖动后,在当前窗口的坐标
            after_move_x = event.x()
            after_move_y = event.y()
            # 获取鼠标拖动后,在系统桌面的坐标
            desktop_x = self.frameGeometry().x()
            desktop_y = self.frameGeometry().y()
            # 移动窗口
            self.move(desktop_x + (after_move_x - self.before_move_x), desktop_y + (after_move_y - self.before_move_y))

    def mousePressEvent(self, event):
        """
        重写继承的鼠标释放事件【鼠标按下生效】
        """
        if event.button() == Qt.LeftButton:
            # 判断鼠标是否按下左键
            self.mouse_state = True
            # 自定义拖动区域的宽度
            custom_drag_range_width = 420
            # 自定义拖动区域的高度
            custom_drag_range_height = 40
            # 获取鼠标在当前窗口的坐标
            before_move_x = event.x()
            before_move_y = event.y()
            # 判断鼠标是否在指定的拖动范围内
            if before_move_x < custom_drag_range_width and before_move_y < custom_drag_range_height:
                self.mouse_range_state = True
                self.before_move_x = before_move_x
                self.before_move_y = before_move_y
            else:
                self.mouse_range_state = False


if __name__ == "__main__":
    # 创建QApplication对象,作为GUI主程序入口
    App = QApplication(sys.argv)
    tips = MainWindow()
    # 显示主窗体
    tips.show()
    # 循环中等待退出程序
    App.exec_()


结果展示

鼠标可以在蓝色部分拖动GUI窗口
在这里插入图片描述

结尾

通过重写的方式可以达到自定义拖动范围的目的,不过该方式也有相应的BUG,目前我还没解决,有发现并解决的小伙伴可以细心我,感激不尽

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值