我创建了一个带有复选框的组合框但是我无法在选中复选框时捕获事件

I have created a combobox with checkboxes But I am unable to catch the event when a checkbox is checked

生成可勾选组合框的代码如下:

def check_able_combox(combo, options, length):

    model = QStandardItemModel(length, 1) # 4 rows, 1 col
    for i,area in enumerate(options):
        item = QStandardItem(area)
        item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        item.setData(Qt.Unchecked, Qt.CheckStateRole)
        model.setItem(i, 0, item)
    combo.setModel(model)
    return combo

我正在以这种方式使用上述功能:

self.checkable_combobox_usecases =check_able_combox(self.usecaseTypeCombobox, usecase_type, len(usecase_type))

其中,self.usecaseTypeCombobox 是我创建的常规组合框,并且 usecase_type 是一个列表 ["Test1", "Test2", "Test3"]

因此,我使用此代码得到了一个带有复选框的组合框。但我也想捕获我正在检查的复选框的文本。有人可以指导我如何捕捉这个事件吗?

我试过 self.checkable_combobox_usecases.currentIndexChanged.connect(self.get_UsecaseType) --> 但没有成功

将槽连接到信号时,槽函数签名应与信号匹配。

此处信号的签名,基于文档是

PySide2.QtWidgets.QComboBox.currentIndexChanged(index)

您需要定义一个函数,将索引作为输入参数。

所以像这样(粗略的代码):

def selectionchange(self,i):
      print "Current index",i,"selection changed ",self.checkable_combobox_usecases.currentText()

并在连接时尝试在 check_able_combox 函数

中执行以下操作
combo.currentIndexChanged.connect(self.selectionchange)

currentIndexChanged 信号仅在选择项目时发出,而不是在选中项目时发出,因此信号将不起作用。

考虑到以上是使用模型的 itemChanged 信号,该信号在某些信息更改时发出,在这种情况下,该信号将在复选框状态更改时以及与角色相关的任何其他信息更改时发出,为了区分我们必须记住之前的状态并检查它是否已经改变。

from PyQt5.QtCore import pyqtSlot, Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow

LastStateRole = Qt.UserRole + 1000


def check_able_combox(combo, options):
    model = QStandardItemModel(len(options), 1)
    for i, area in enumerate(options):
        item = QStandardItem(area)
        item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        item.setData(Qt.Unchecked, Qt.CheckStateRole)
        model.setItem(i, 0, item)
    combo.setModel(model)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.usecaseTypeCombobox = QComboBox()

        usecase_type = ["Test1", "Test2", "Test3"]
        check_able_combox(self.usecaseTypeCombobox, usecase_type)

        self.setCentralWidget(self.usecaseTypeCombobox)

        self.usecaseTypeCombobox.model().itemChanged.connect(self.on_itemChanged)

    @pyqtSlot("QStandardItem*")
    def on_itemChanged(self, item):
        last_state = item.data(LastStateRole)
        current_state = item.data(Qt.CheckStateRole)
        # verify that the modified data is related to the Qt::CheckStateRole role
        if last_state != current_state:
            # save last state
            item.model().blockSignals(True)
            item.setData(current_state, LastStateRole)
            item.model().blockSignals(False)

            print(current_state, item.text())


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)

    w = MainWindow()
    w.show()
    sys.exit(app.exec_())