PyQt5 – QActionGroup

  • Post category:Python

当你使用 PyQT5 开发桌面应用程序时,你可能会需要为同一类型的 QAction 控件建立一个 QActionGroup。 QActionGroup 负责管理 QAction 控件,并保证它们在一组中,只有一个可以被选中。

下面是使用 QActionGroup 的基本步骤:

1. 导入 PyQt5.QtWidgets.QActionGroup 和 PyQt5.QtWidgets.QAction:

from PyQt5.QtWidgets import QAction, QActionGroup

2. 创建 QActionGroup 对象:

group = QActionGroup(self)

3. 创建 QAction 对象并将其添加到 QActionGroup 中:

action1 = QAction("Action 1", self)
action2 = QAction("Action 2", self)
group.addAction(action1)
group.addAction(action2)

4. 设置 QActionGroup 的 exclusive 属性为 True,以便同一时间只能选中一个 QAction:

group.setExclusive(True)

示例1

下面的示例展示了如何创建一个 QActionGroup,其中包含两个 QAction,并使用槽函数处理这些 QAction 的 toggled 信号:

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QActionGroup

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("ActionGroup Demo")
        self.setGeometry(100, 100, 400, 300)

        group = QActionGroup(self)

        action1 = QAction("Action 1", self)
        action1.setCheckable(True)
        action1.toggled.connect(self.onAction1Toggled)
        group.addAction(action1)

        action2 = QAction("Action 2", self)
        action2.setCheckable(True)
        action2.toggled.connect(self.onAction2Toggled)
        group.addAction(action2)

        group.setExclusive(True)

        toolbar = self.addToolBar("Toolbar")
        toolbar.addAction(action1)
        toolbar.addAction(action2)

    def onAction1Toggled(self, checked):
        print("Action 1 toggled: {}".format(checked))

    def onAction2Toggled(self, checked):
        print("Action 2 toggled: {}".format(checked))

if __name__ == "__main__":
    app = QApplication([])
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

示例2

下面的示例中,我们创建一个 实心/空心 形状的画笔工具,使用 QActionGroup 管理它们。我们还将使用QLabel窗口小部件,以便用户可以查看当前选择的形状。

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QActionGroup, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt

class DrawingWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("ActionGroup Demo")
        self.setGeometry(100, 100, 400, 300)

        group = QActionGroup(self)

        solidPen = QAction("Solid Pen", self)
        solidPen.setCheckable(True)
        solidPen.setChecked(True)
        group.addAction(solidPen)

        dottedPen = QAction("Dotted Pen", self)
        dottedPen.setCheckable(True)
        group.addAction(dottedPen)

        group.setExclusive(True)

        label = QLabel(self)
        label.setAlignment(Qt.AlignCenter)
        label.setText("Solid Pen")
        label.setMinimumHeight(30)

        drawingArea = QWidget(self)

        layout = QVBoxLayout(drawingArea)
        layout.addWidget(label)

        self.setCentralWidget(drawingArea)

        toolbar = self.addToolBar("Toolbar")
        toolbar.addAction(solidPen)
        toolbar.addAction(dottedPen)

        drawingArea.show()

    def paintEvent(self, event):
        pen = QPen()
        if self.sender().text() == "Dotted Pen":
            pen.setStyle(Qt.DotLine)
        qp = QPainter(self)
        qp.setPen(pen)
        qp.drawLine(20, 60, 360, 60)

    def onPenToolChanged(self, action):
        if action.text() == "Solid Pen":
            self.label.setText("Solid Pen")
        if action.text() == "Dotted Pen":
            self.label.setText("Dotted Pen")

if __name__ == "__main__":
    app = QApplication([])
    mainWindow = DrawingWindow()
    mainWindow.show()
    app.exec_()

在以上示例中,我们创建了一个 DrawingWindow 类,它继承自 QMainWindow。我们创建了一个 QActionGroup,其中包含实心画笔和点画画笔两个 QAction 对象,然后将这两个 QAction 对象作为工具栏的 action 添加到了 QMainWindow 对象中。

当用户选择了所需的画笔工具后,我们重新绘制窗口主体,并在窗口底部的 QLabel 中显示用户选择的当前画笔形状。

上述过程演示了如何在 PyQT5 框架下使用 QActionGroup 以及如何同时操作多个 QAction 的方法。