在PyQT中更改QToolBox选中项的图标

Change the Icon of the Selected Item of the QToolBox in PyQT

PyQT代码如下,

from PyQt5.QtWidgets import *
import sys

class Window(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        layout = QGridLayout()
        self.setLayout(layout)

        # Add toolbar and items
        toolbox = QToolBox()
        layout.addWidget(toolbox, 0, 0)
        label = QLabel()
        toolbox.addItem(label, "Students")
        label = QLabel()
        toolbox.addItem(label, "Teachers")
        label = QLabel()
        toolbox.addItem(label, "Directors")

app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

我想要的是,每当该工具箱中的一个项目被 select 编辑时,它的图标应该从“直箭头”变为“向下箭头”,以表示该项目当前已打开,而其他项目正在打开关闭。现在,如果单击另一个项目,则第一个项目的箭头应再次更改回 arrow-straight,并且现在单击的项目的箭头也会更改。

如何在 PyQT 中完成此操作?无论是来自设计师还是代码逻辑。

编辑:例如,看看下面这个设计师,

由于“注册详细信息”已 selected,因此我希望将其箭头替换为另一个图标(说“向下箭头”图标)。一旦我 select 工具箱中的其他项目(如 View Clashes),注册详细信息的箭头应替换为旧箭头,View Clashes 箭头应更改为另一个图标。

Pyuic 文件中的代码是这样的,

icon = QIcon()
        icon.addFile(u":/icons/icons/arrow-right.svg", QSize(), QIcon.Normal, QIcon.Off)
        self.toolBox.addItem(self.page_2, icon, u"Registration Details")

您可以在添加项目时设置一个默认图标,然后连接currentChanged信号以设置另一个。

如果你创建一个包含两个图标的基本列表,设置合适的图标就更简单了,因为你只需要循环遍历所有项目并根据索引匹配设置图标。

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.arrowIcons = []
        for direction in ('right', 'down'):
            self.arrowIcons.append(QtGui.QIcon(
                ':/icons/icons/arrow-{}.svg'.format(direction)))

        layout = QtWidgets.QVBoxLayout(self)
        self.toolBox = QtWidgets.QToolBox()
        layout.addWidget(self.toolBox)
        self.toolBox.currentChanged.connect(self.updateIcons)
        for i in range(5):
            self.toolBox.addItem(
                QtWidgets.QLabel(), 
                self.arrowIcons[0], 
                'Item {}'.format(i + 1))

    def updateIcons(self, index):
        for i in range(self.toolBox.count()):
            self.toolBox.setItemIcon(i, self.arrowIcons[index == i])