当你使用 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 的方法。