【问题标题】:I have created a combobox with checkboxes But I am unable to catch the event when a checkbox is checked我创建了一个与复选框的组合框,但是当检查复选框时,我无法捕获该活动
【发布时间】:2020-01-15 20:28:27
【问题描述】:

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

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) --> 但是没用

【问题讨论】:

    标签: python pyqt pyqt5 qcombobox


    【解决方案1】:

    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_())
    

    【讨论】:

    • 非常感谢您的回答。它解决了我的拦截器。我还有一个问题要问你。每次选中复选框时,我还尝试将item.text() 发送到 QTableWidget。每次选中复选框时,我都能够向表中添加新行,但是我无法在 QTableWidget 行中显示复选框的文本。你能帮帮我吗?
    • @user1430431 如果你还有问题再写一篇,cmets只用来讨论当前的Q/A
    • 是否也可以获取勾选的复选框的索引?
    • @user1430431 我想你想用它来解决你的其他问题,我提出了一个更容易的答案
    【解决方案2】:

    当你将一个槽连接到一个信号时,槽函数签名应该与信号匹配。

    这里的信号签名,根据文档是

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2013-06-17
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多