PyQt5在FramelessWindowHint模式下实现窗口移动与缩放
时间: 2024-03-25 19:36:44 浏览: 91
PyQt5实现无边框窗口的标题拖动和窗口缩放
在PyQt5中,要实现窗口的自定义移动和缩放行为,需要使用`QPoint`和`QRect`类。以下是一个简单的示例,演示了如何在FramelessWindowHint模式下实现窗口的移动和缩放。
```python
from PyQt5.QtCore import Qt, QPoint, QRect
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QCursor
class CustomWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 640, 480)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setCursor(Qt.ArrowCursor)
self.title_bar = QLabel("Custom Window Title", self)
self.title_bar.setGeometry(QRect(0, 0, self.width(), 30))
self.title_bar.setAlignment(Qt.AlignCenter)
self.title_bar.setStyleSheet("background-color: gray; color: white; font-size: 16px;")
def mousePressEvent(self, event):
self.offset = event.pos()
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
self.move(self.pos() + event.pos() - self.offset)
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.LeftButton:
if self.isMaximized():
self.showNormal()
else:
self.showMaximized()
def mouseReleaseEvent(self, event):
self.setCursor(Qt.ArrowCursor)
def mousePressEvent(self, event):
self.offset = event.pos()
if self.title_bar.geometry().contains(event.pos()):
self.setCursor(Qt.ClosedHandCursor)
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
if self.isMaximized():
self.showNormal()
diff = QPoint(event.pos() - self.offset)
if event.pos().x() < 20 and event.pos().y() < 20:
self.setCursor(Qt.SizeFDiagCursor)
self.resize(self.width() + diff.x(), self.height() + diff.y())
elif event.pos().x() > self.width() - 20 and event.pos().y() > self.height() - 20:
self.setCursor(Qt.SizeFDiagCursor)
self.resize(self.width() - diff.x(), self.height() - diff.y())
elif event.pos().x() < 20 and event.pos().y() > self.height() - 20:
self.setCursor(Qt.SizeBDiagCursor)
self.resize(self.width() + diff.x(), self.height() - diff.y())
elif event.pos().x() > self.width() - 20 and event.pos().y() < 20:
self.setCursor(Qt.SizeBDiagCursor)
self.resize(self.width() - diff.x(), self.height() + diff.y())
elif event.pos().x() < 20:
self.setCursor(Qt.SizeHorCursor)
self.resize(self.width() + diff.x(), self.height())
elif event.pos().x() > self.width() - 20:
self.setCursor(Qt.SizeHorCursor)
self.resize(self.width() - diff.x(), self.height())
elif event.pos().y() < 20:
self.setCursor(Qt.SizeVerCursor)
self.resize(self.width(), self.height() + diff.y())
elif event.pos().y() > self.height() - 20:
self.setCursor(Qt.SizeVerCursor)
self.resize(self.width(), self.height() - diff.y())
else:
self.move(self.pos() + diff)
```
这个示例中,我们创建了一个自定义窗口`CustomWindow`,它继承了`QWidget`类。我们在构造函数中设置了窗口的几何形状,并将窗口标志设置为`Qt.FramelessWindowHint`,以便在没有窗口边框的情况下显示窗口。
我们添加了一个标题栏,使用`QLabel`类来创建。我们重载了一些鼠标事件函数,包括`mousePressEvent()`、`mouseMoveEvent()`、`mouseDoubleClickEvent()`和`mouseReleaseEvent()`,并实现了自定义的窗口移动和缩放行为。
在`mousePressEvent()`中,我们记录了鼠标指针的位置,以便在移动窗口时计算窗口的偏移量。在`mouseMoveEvent()`中,我们检查鼠标指针的位置,以实现窗口的移动和缩放。
当鼠标指针位于窗口的四个角落时,我们将光标设置为`Qt.SizeFDiagCursor`或`Qt.SizeBDiagCursor`,以表示窗口将被缩放。当鼠标指针位于窗口的顶部、底部或两侧时,我们将光标设置为`Qt.SizeHorCursor`或`Qt.SizeVerCursor`,以表示窗口将被水平或垂直缩放。
在`mouseDoubleClickEvent()`中,我们检查鼠标指针的位置,并最大化或还原窗口的大小。在`mouseReleaseEvent()`中,我们将光标设置为`Qt.ArrowCursor`,以表示操作已完成。
最后,在`mousePressEvent()`中,我们检查鼠标指针的位置是否在标题栏内,并将光标设置为`Qt.ClosedHandCursor`,以表示窗口可以移动。
阅读全文