PyQtGraphQtGuiQMainWindow子窗口的拖拽和调整大小
发布时间:2023-12-13 12:35:46
在PyQtGraph中,可以使用QtGui.QMainWindow类来创建主窗口。要在主窗口中添加子窗口并实现拖拽和调整大小的功能,可以使用QtGui.QWidget类和QtGui.QBoxLayout类。
下面是一个使用PyQtGraph创建主窗口及其子窗口的示例代码:
from PyQt5 import QtGui, QtCore, QtWidgets
import pyqtgraph as pg
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# 创建一个中心窗口作为主窗口的中央部件
self.centralWidget = QtGui.QWidget(self)
self.setCentralWidget(self.centralWidget)
# 创建一个垂直布局将其应用于中心窗口
self.layout = QtGui.QVBoxLayout()
self.centralWidget.setLayout(self.layout)
# 创建一个子窗口并将其添加到布局中
self.subWindow = QtGui.QWidget(self)
self.subWindow.setStyleSheet("background-color: #cccccc; border: 1px solid #000000;")
self.subWindow.setMinimumSize(200, 200)
self.layout.addWidget(self.subWindow)
# 启用子窗口的拖拽和调整大小功能
self.subWindow.setWindowFlags(QtCore.Qt.Window)
self.subWindow.setMouseTracking(True)
# 创建一个可调整大小的控制器
self.resizer = QtWidgets.QSizeGrip(self.subWindow)
self.resizer.setStyleSheet("background-color: #ffffff; border: none;")
# 将控制器添加到子窗口右下角
self.resizer.setGeometry(self.subWindow.width() - 20, self.subWindow.height() - 20, 20, 20)
self.resizer.setToolTip("Drag to resize")
# 为拖动和调整大小的事件连接槽函数
self.subWindow.mouseMoveEvent = self.mouseMoveEvent
self.subWindow.mousePressEvent = self.mousePressEvent
self.subWindow.mouseReleaseEvent = self.mouseReleaseEvent
self.resizer.mouseMoveEvent = self.mouseMoveEvent
self.resizer.mousePressEvent = self.mousePressEvent
self.resizer.mouseReleaseEvent = self.mouseReleaseEvent
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.dragPos = event.globalPos()
self.dragSubWindowPos = self.subWindow.pos()
event.accept()
def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.dragPos = None
self.dragSubWindowPos = None
event.accept()
def mouseMoveEvent(self, event):
if self.dragPos is not None:
newPos = self.dragSubWindowPos + (event.globalPos() - self.dragPos)
self.subWindow.move(newPos)
self.resizer.setGeometry(self.subWindow.width() - 20, self.subWindow.height() - 20, 20, 20)
event.accept()
在这个例子中,我们创建了一个继承自QtWidgets.QMainWindow的主窗口类MainWindow。在构造函数中,我们创建了一个中心窗口并将其设置为主窗口的中央部件。然后,我们创建了一个垂直布局并将其应用于中心窗口。然后,我们创建了一个子窗口并将其添加到布局中。
为了实现拖拽和调整大小的功能,我们将子窗口的窗口标志设置为QtCore.Qt.Window,并设置setMouseTracking(True)以启用鼠标跟踪。然后,我们创建了一个可调整大小的控制器并将其添加到子窗口的右下角。最后,我们将拖动和调整大小的事件连接到槽函数。
在mousePressEvent中,我们检查左键是否按下,并保存当前的鼠标位置和子窗口的位置。在mouseReleaseEvent中,我们清空保存的位置。在mouseMoveEvent中,如果我们有保存的位置,我们根据鼠标位置的变化来移动子窗口,并根据子窗口的大小来更新控制器的位置。
通过运行这个代码,你将会看到一个包含可拖拽和可调整大小子窗口的主窗口。你可以按住子窗口的标题栏拖动它,或者点击并拖动控制器来调整子窗口的大小。
