Francisco Viegas
Francisco Viegas

Reputation: 23

How to make dynamic combobox PYQT5

I want to make a dynamic combobox, if i choose the option "Gasto" in the next combobox, I want to see for example "Agua", "Gas" etc, and if, choose "Financas", have only " Fundos de tesouraria " and " Fundos de investimento de obrigações"

def initUI(self):
    #self.setWindowTitle(self.title)
    for t in self.tipos:
        self.comboBoxCategoriaGasto.addItem(t)
    for i in self.tipos2:
        self.comboBoxTiposGasto_2.addItem(i)


    self.tipos = ["Gasto", "Finaças"]
    self.tipos2 = ["Alimentação", "Transporte", "Água","Luz","Gás","Internet", "Faculdade", "Depósitos a prazo","Fundos de tesouraria","Fundos de investimento de obrigações","Fundos de investimento de ações",]

Upvotes: 2

Views: 924

Answers (1)

eyllanesc
eyllanesc

Reputation: 243887

You have to create a tree type model where the selected item of the nth QComboBox is the rootModelIndex of the (n+1)-th QComboBox:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.model = QtGui.QStandardItemModel(self)

        self.combo1 = QtWidgets.QComboBox()
        self.combo2 = QtWidgets.QComboBox()

        self.combo1.setModel(self.model)
        self.combo2.setModel(self.model)

        d = {
            "Gasto": ["Agua", "Gas"],
            "Financas": [
                "Fundos de tesouraria",
                "Fundos de investimento de obrigações",
            ],
        }

        for key, options in d.items():
            root_it = QtGui.QStandardItem(key)
            self.model.appendRow(root_it)
            for option in options:
                it = QtGui.QStandardItem(option)
                root_it.appendRow(it)

        self.combo1.currentIndexChanged.connect(self.onCurrentIndexChanged)
        self.onCurrentIndexChanged(0)

        hlay = QtWidgets.QHBoxLayout(self)
        hlay.addWidget(self.combo1)
        hlay.addWidget(self.combo2)

    @QtCore.pyqtSlot(int)
    def onCurrentIndexChanged(self, index):
        ix = self.model.index(index, 0, self.combo1.rootModelIndex())
        self.combo2.setRootModelIndex(ix)
        self.combo2.setCurrentIndex(0)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.resize(640, 120)
    w.show()
    sys.exit(app.exec_())

Upvotes: 3

Related Questions