欢迎访问宙启技术站
智能推送

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中,如果我们有保存的位置,我们根据鼠标位置的变化来移动子窗口,并根据子窗口的大小来更新控制器的位置。

通过运行这个代码,你将会看到一个包含可拖拽和可调整大小子窗口的主窗口。你可以按住子窗口的标题栏拖动它,或者点击并拖动控制器来调整子窗口的大小。