【问题标题】:How to connect checkboxes to a QComboBox如何将复选框连接到 QComboBox
【发布时间】:2021-08-19 20:26:21
【问题描述】:

我想在检查某些复选框时过滤 PyQt5 QCombobox 中的项目。

例子:

samplelist=["a1","a2","a3","b1","b2","b3"] 是 QCombobox comboBox 的项目列表,我有两个复选框 checkBoxacheckBoxb。如果

  • checkboxa 选中和 checkboxb 未选中:comboBox 有项目 ["a1", "a2", "a3"]
  • checkboxa 未选中,checkboxb 已选中:comboBox 有项目 ["b1", "b2", "b3"]
  • checkboxa 未选中,checkboxb 未选中:comboBox 为空
  • checkboxa 已检查,checkboxb 已检查:comboBox 具有 samplelist

有谁知道如何将checkboxacheckbox 连接到comboBox 以实现所述结果?

最小示例(复选框未连接到组合框)

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *  

class ExampleWindow(QDialog):
    def __init__(self,parent=None):
        super(ExampleWindow,self).__init__(parent)

        mainLayout=QtWidgets.QGridLayout()
        
        samplelist=["a1","a2","a3","b1","b2","b3"]

        # Create combobox and add items.
        self.comboBox = QComboBox()
        self.comboBox.addItems(samplelist)

        #Create checkboxes
        self.checkBoxa = QCheckBox("Select a") 
        self.checkBoxb = QCheckBox("Select b")
        
        mainLayout.addWidget(self.comboBox,1,0,1,2)
        mainLayout.addWidget(self.checkBoxa,0,0,1,1)
        mainLayout.addWidget(self.checkBoxb,0,1,1,1)
        

        self.setLayout(mainLayout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = ExampleWindow()
    mainWin.show()
    sys.exit( app.exec_() )

【问题讨论】:

    标签: python pyqt5 qcombobox qcheckbox


    【解决方案1】:

    由于您的问题不明确,我将假设每个 QCheckBox 都与一个字母相关联,并且您只想显示以与选中的 QCheckBox 相关联的字母开头的项目。如果是这样,那么最好基于项目创建模型并使用 QSortFilterProxyModel 过滤它们。

    class FilterProxyModel(QSortFilterProxyModel):
        def __init__(self, parent=None):
            super().__init__(parent)
            self._letters = list()
    
        @property
        def letters(self):
            return self._letters
    
        @letters.setter
        def letters(self, letters):
            self._letters = letters.copy()
            self.invalidateFilter()
    
        def filterAcceptsRow(self, source_row, source_parent):
            index = self.sourceModel().index(source_row, 0, source_parent)
            data = index.data()
            return any(data.startswith(letter) for letter in self.letters)
    
    
    class ExampleWindow(QDialog):
        def __init__(self, parent=None):
            super(ExampleWindow, self).__init__(parent)
    
            mainLayout = QGridLayout(self)
    
            letters = ("a", "b", "c", "d")
    
            samplelist = [f"{letter}{i}" for i in range(1, 5) for letter in letters]
    
            self.model = QStandardItemModel()
            for e in samplelist:
                item = QStandardItem(e)
                self.model.appendRow(item)
    
            self.proxy_model = FilterProxyModel()
            self.proxy_model.setSourceModel(self.model)
    
            self.comboBox = QComboBox()
            self.comboBox.setModel(self.proxy_model)
    
            self.checkboxs = []
    
            for i, letter in enumerate(letters):
                checkbox = QCheckBox(f"Select {letter}")
                checkbox.setProperty("letter", letter)
                checkbox.toggled.connect(self.handle_toggled)
                mainLayout.addWidget(checkbox, 0, i)
                self.checkboxs.append(checkbox)
    
            mainLayout.addWidget(self.comboBox, 1, 0, 1, len(letters))
    
            self.handle_toggled()
    
        def handle_toggled(self):
            letters = []
            for checkbox in self.checkboxs:
                if checkbox.isChecked():
                    letters.append(checkbox.property("letter"))
            self.proxy_model.letters = letters
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 2014-05-13
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      相关资源
      最近更新 更多