PyQt5 QDockWidget – 允许区域改变的信号

  • Post category:Python

PyQt5是一种流行的Python GUI库,它提供了许多功能强大的小部件和工具,使得开发者们可以轻松地创建各种操作系统的图形用户界面。其中,QDockWidget是PyQt5中可用的一种对话框部件,它提供了可拖动的、可停靠的工具窗口,可用于在主窗口中添加各种子窗口,为用户提供更好的交互体验。本篇攻略将详细讲解如何使用PyQt5中的QDockWidget,并介绍如何处理允许区域改变的信号。

1.基本操作

在PyQt5中使用QDockWidget非常简单,仅需在主窗口中添加一个QDockWidget小部件即可。以下是一个基本的使用示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        dockWidget = QDockWidget('DockWidget', self)
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)

        textEdit = QTextEdit()
        dockWidget.setWidget(textEdit)

app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

以上代码演示了在主窗口中添加一个QDockWidget,并在其中添加一个QTextEdit小部件。在构造函数中,首先新建一个QDockWidget,并设置它可以停靠在主窗口的左侧或右侧(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea);然后,将其添加到主窗口中并设置其内容为textEdit小部件。

运行以上代码,可以看到主窗口中添加了一个停靠窗口,其中包含一个文本编辑框。我们可以通过拖动窗口标题的方式,让其停靠在主窗口的左或右侧,也可以通过单击停靠窗口的标题,让其浮动到主窗口之外。

2.允许区域改变的信号使用

在QDockWidget中,允许区域改变的信号(QDockWidget.allowedAreasChanged)非常有用,它可以使得程序在运行时动态地处理窗口的停靠区域更改事件。具体使用方法如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        dockWidget = QDockWidget('DockWidget', self)
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
        dockWidget.allowedAreasChanged.connect(self.onAllowedAreasChanged)  # 连接信号
        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)

        textEdit = QTextEdit()
        dockWidget.setWidget(textEdit)

    def onAllowedAreasChanged(self, areas):
        print('allowedAreas:', areas)

app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

以上代码演示了如何连接QDockWidget.allowedAreasChanged信号,并在其回调函数onAllowedAreasChanged()中处理允许区域改变的事件。每当用户改变停靠窗口的停靠区域时,程序就会调用onAllowedAreasChanged()函数,输出当前的停靠区域参数。这样,我们就可以根据用户的操作动态地改变QDockWidget的停靠区域。

除此之外,我们还可以在QDockWidget中使用一些其他有用的信号和函数,例如:

  • close():关闭停靠窗口。
  • featuresChanged:在停靠窗口功能更改时发出信号。
  • dockLocationChanged:在停靠窗口的位置更改时发出信号。
  • setFeatures():设置停靠窗口的一些特性,例如允许浮动,允许关闭等。
  • setWindowTitle():设置停靠窗口的标题。

3.示例说明

为了更好地理解QDockWidget的使用方法,我们可以通过两个示例来演示其功能:

示例1:停靠窗口中的按钮响应事件

在这个示例中,我们将在停靠窗口中创建一个QPushButton按钮,并在其槽函数中打印一些信息。代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        dockWidget = QDockWidget('DockWidget', self)
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)

        button1 = QPushButton('Button1')
        button1.clicked.connect(lambda:self.onButtonClicked(1))
        button2 = QPushButton('Button2')
        button2.clicked.connect(lambda:self.onButtonClicked(2))

        vbox = QVBoxLayout()
        vbox.addWidget(button1)
        vbox.addWidget(button2)

        widget = QWidget()
        widget.setLayout(vbox)

        dockWidget.setWidget(widget)
        dockWidget.allowedAreasChanged.connect(self.onAllowedAreasChanged)

        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)

    def onButtonClicked(self, buttonId):
        print('Button%d clicked.' % buttonId)

    def onAllowedAreasChanged(self, areas):
        print('allowedAreas:', areas)

app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

当我们运行这个程序时,可以看到在主窗口的左侧出现了一个停靠窗口,其中包含两个QPushButton按钮。每当我们单击按钮时,在控制台中就会输出Button1 clicked. 或Button2 clicked. 的消息。另外,当我们拖动停靠窗口的位置或停靠它的区域时,也会在控制台中输出对应的allowedAreas信息。

示例2:在QDockWidget中添加图像

在这个示例中,我们将在停靠窗口中添加一个QLabel,并将其显示一个本地图像。代码如下:

import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QLabel

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        dockWidget = QDockWidget('DockWidget', self)
        dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)

        label = QLabel()
        pixmap = QPixmap('image.png')
        label.setPixmap(pixmap)

        dockWidget.setWidget(label)

        self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget)

app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

当我们运行这个程序时,可以看到在主窗口的左侧出现了一个停靠窗口,其中包含了一个显示本地图像的QLabel。这个示例演示了如何在QDockWidget中添加其他类型的小部件,以及如何使用QPixmap加载本地图像并显示在QLabel中。