Skip to content Skip to sidebar Skip to footer

Dynamic Qcombobox Fill Dependent On User Input Pyqt5

I created QTableWidget and in first two columns inserted comboboxes. The first column contains unique records (first elements from list of lists). My aim is to make these combo box

Solution 1:

The first task that must be done is to create a structure of data that allows to handle the data of simple form, in this case a dictionary is used that contain lists:

self.d = {" ": []}

foritemin list1:
    combo1 = item[0]
    combo2 = item[2]
    if combo2 not inself.d[" "]:
        self.d[" "].append(combo2)

    if combo1 inself.d.keys():
        if combo2 not inself.d[combo1]:
            self.d[combo1].append(combo2)
    else:
        self.d[combo1] = []

Output:

{ 
   ' '         : ['PP', 'BR', 'KL'], 
   'Butterfly' : ['PP', 'BR'], 
   'Backpack'  : ['BR'], 
   'Toy'       : ['KL'] 
}

Then connect the currentTextChanged signals of the QComboBox, but you must also pass the other associated QComboBox for that the lambda function is used. with the blockSignals() method we block that a loop is generated between the signals.

classWindow(QMainWindow):
    [...]
    defTable_of_widgets(self):
        [...]

        list1 = [...]


        self.d = {" ": [" "]}
        self.d_inverse = {" ": [" "]}

        defcreateData(key1, key2, data):
            if key2 notin data[" "]:
                data[" "].append(key2)
            if key1 in data.keys():
                if key2 notin data[key1]:
                    data[key1].append(key2)
            else:
                data[key1] = [" ", key2]
            return data

        for item in list1:
            item1 = item[0]
            item2 = item[2]
            self.d = createData(item1, item2, self.d)
            self.d_inverse = createData(item2, item1, self.d_inverse)

        for i inrange(rowCount):
            comboA = QComboBox()
            comboB = QComboBox()
            comboA.addItems(self.d.keys())
            comboB.addItems(self.d[comboA.currentText()])
            self.table.setCellWidget(i, 0, comboA)
            self.table.setCellWidget(i, 1, comboB)
            comboA.currentTextChanged.connect(lambda text, row=i: self.onComboACurrentTextChanged(text, row))
            comboB.currentTextChanged.connect(lambda text, row=i: self.onComboBCurrentTextChanged(text, row))

    defupdateCombox(self, combo1, combo2, item1, item2):
        text = combo1.currentText()
        combo1.blockSignals(True)
        combo2.blockSignals(True)
        combo1.clear()
        combo2.clear()

        combo2.addItems(item1[text])
        combo2.setCurrentIndex(1if text != " "else0)
        combo1.addItems(item2[combo2.currentText()])
        combo1.setCurrentText(text)

        combo1.blockSignals(False)
        combo2.blockSignals(False)

    defonComboACurrentTextChanged(self, text, row):
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        self.updateCombox(comboA, comboB, self.d, self.d_inverse)

    defonComboBCurrentTextChanged(self, text, row):
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        self.updateCombox(comboB, comboA, self.d_inverse, self.d)

Post a Comment for "Dynamic Qcombobox Fill Dependent On User Input Pyqt5"