主要代码
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,目前我还没解决,有发现并解决的小伙伴可以细心我,感激不尽