如果单击一组复选框中的任何一个,PyQt6 如何触发操作?

问题描述

我在 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) 都无济于事。

我在谷歌上搜索过这个,而且真的谷歌从来没有找到你真正想要的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)