0

我在 QGroupBox 内的 QVBoxLayout 内的 QGridLayout 内有九个 QCheckBox,并且我在 QGroupBox 中定义了一个函数,用于更新 QVBoxLayout 内的 QScrollArea,并且我希望在任何一组复选框被单击时执行该函数。

如何完成上述任务?我只知道.stateChanged.clicked信号,我必须创建九个连接吗?

这是示例代码:

class FilterArea(QGroupBox):
    def __init__(self):
        super().__init__()
        self.vbox = QVBoxLayout(self)
        self.vbox.setAlignment(ALIGNMENT)
        self.titleBar = QHBoxLayout()
        self.title = Label('Filter')
        self.titleBar.addStretch()
        self.titleBar.addWidget(self.title)
        self.titleBar.addStretch()
        self.label = Label('By:')
        self.checkboxArea = QGridLayout()
        self.checkboxs = dict()
        for i in [
            'Artist', 'Title', 'Downloaded',
            'Instrumental', 'Language', 'Genre',
            'Style', 'ArtistGender', 'ArtistCount'
        ]:
            self.checkboxs.update({i: CheckBox(i)})
        self.values = list(self.checkboxs.values())
        for i, item in enumerate(self.values):
            y = i // 3
            x = i - 3 * y
            self.checkboxArea.addWidget(item, y, x)
        self.checkboxArea.setVerticalSpacing(4)
        self.vbox.addLayout(self.titleBar)
        self.vbox.addWidget(self.label)
        self.vbox.addLayout(self.checkboxArea)
        self.scrollArea = QScrollArea(self)
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidget = QWidget()
        self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
        self.scrollArea.setWidget(self.scrollAreaWidget)
        self.scrollArea.setAlignment(ALIGNMENT)
        self.scrollAreaLayout = QVBoxLayout(self.scrollAreaWidget)
        self.vbox.addWidget(self.scrollArea)
        self.setContentsMargins(3, 20, 3, 3)
        self.appliedFilters = []
    
    def updateFilter(self):
        for item in self.values:
            if item.checkState() == Qt.CheckState.Checked:
                filter = Filter(item.text, 'search')
                self.appliedFilters.append(item)
                self.scrollAreaLayout.addWidget(filter)
            else:
                index = self.appliedFilters.index(item)
                layoutItem = self.scrollAreaLayout.itemAt(index)
                widget = layoutItem.widget()
                self.scrollAreaLayout.removeItem(layoutItem)
                self.scrollAreaLayout.removeWidget(widget)

如何在单击任何复选框时使函数运行,并消除 for 循环的需要,使函数自动知道单击了哪个复选框?

我已经尝试过@pyqtSlot(QCheckBox)def onItemClicked(self, item)但无济于事。

我已经用谷歌搜索过这个,而且谷歌从来没有找到你真正想要的任何东西。

4

0 回答 0