我在 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)
但无济于事。
我已经用谷歌搜索过这个,而且谷歌从来没有找到你真正想要的任何东西。