PyQt5 实现鼠标拖动窗口功能 - 类示例
下面是一个简单的示例代码,展示了如何使用 PyQt5 编写一个类实现拖动窗口的功能:
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QApplication, QMainWindow
class DraggableWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.draggable = False
self.offset = None
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.draggable = True
self.offset = event.pos()
def mouseMoveEvent(self, event):
if self.draggable:
self.move(event.globalPos() - self.offset)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.draggable = False
self.offset = None
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.LeftButton:
if self.isMaximized():
self.showNormal()
else:
self.showMaximized()
def enterEvent(self, event):
self.setCursor(QCursor(Qt.SizeAllCursor))
def leaveEvent(self, event):
self.setCursor(QCursor(Qt.ArrowCursor))
if __name__ == '__main__':
app = QApplication([])
window = DraggableWindow()
window.show()
app.exec_()
在这个例子中,我们定义了一个名为 DraggableWindow 的类,它继承自 QMainWindow 类。我们通过设置窗口的属性和标志来让窗口无边框并且透明,以便我们可以在窗口中实现自定义的拖动功能。
我们还定义了一些方法来处理鼠标事件。在 mousePressEvent 中,我们检查鼠标是否按下了左键,并将 draggable 标志设置为 True,以便在 mouseMoveEvent 中移动窗口。我们还记录鼠标的偏移量,以便在移动窗口时保持窗口与鼠标的位置关系。
在 mouseMoveEvent 中,我们检查 draggable 标志是否为 True,如果是,则移动窗口。我们通过计算当前鼠标位置与偏移量之间的差异来计算窗口的新位置。
在 mouseReleaseEvent 中,我们检查鼠标是否释放了左键,并将 draggable 标志设置为 False,以便停止移动窗口。
在 mouseDoubleClickEvent 中,我们检查鼠标是否双击了左键,并根据窗口的当前状态来最大化或还原窗口。
最后,在 enterEvent 和 leaveEvent 方法中,我们设置鼠标光标的样式,以便在鼠标进入或离开窗口时改变鼠标光标的样式。
原文地址: https://www.cveoy.top/t/topic/nSbT 著作权归作者所有。请勿转载和采集!