Search code examples
pythonpyqt5qcombobox

Adding a QComboBox for specific columns for each row PyQt5


I have a QT Table Widget where I get data from sql, I wanted to put a combo box to the column 4, 5, 6 and 7 (for now let's do it only for the 4th column). I did it but when I execute the the code my QComboBox is shown only in the last row, this because I have a for cycle that inserts rows in the table and I put the self.table.setCellWidget(row, column, combobox) in this loop, so everytime it's executed it moves the combobox to the last row, how can I have a combo box for each row? Here's my code

 def datitabella(self):    
    delegate = MyDelegate(self)
    tablerow = 0 
    conteggio = c.execute('SELECT COUNT(ID) FROM Viaggi').fetchone()[0]
    combo = QComboBox()
    for p in c.execute("SELECT Customer_code FROM Customers "):
        combo.addItem(str(p))         
    for row in c.execute("SELECT * FROM Viaggi "):
        righe = 0 
        self.tabella_registrazioni.setRowCount(conteggio)
        self.tabella_registrazioni.setItem(tablerow, 0, QtWidgets.QTableWidgetItem(str(row[0])))
        self.tabella_registrazioni.setItem(tablerow, 1, QtWidgets.QTableWidgetItem(row[1]))
        self.tabella_registrazioni.setItem(tablerow, 2, QtWidgets.QTableWidgetItem(row[2]))
        self.tabella_registrazioni.setItem(tablerow, 3, QtWidgets.QTableWidgetItem(row[3]))
        self.tabella_registrazioni.setItem(tablerow, 4, QtWidgets.QTableWidgetItem(row[4]))
        self.tabella_registrazioni.setItem(tablerow, 5, QtWidgets.QTableWidgetItem(row[5]))
        self.tabella_registrazioni.setItem(tablerow, 6, QtWidgets.QTableWidgetItem(row[6]))
        self.tabella_registrazioni.setItem(tablerow, 7, QtWidgets.QTableWidgetItem(row[7]))
        self.tabella_registrazioni.setItem(tablerow, 19, QtWidgets.QTableWidgetItem(str(row[19])))
        self.tabella_registrazioni.setCellWidget(tablerow, 4, combo)
        tablerow+= 1           
    self.tabella_registrazioni.itemChanged.connect(self.changeIcon) 
    self.tabella_registrazioni.setItemDelegateForColumn(0, delegate)

Solution

  • You have to create a new QComboBox for each row:

    def datitabella(self):    
        delegate = MyDelegate(self)
        tablerow = 0
        conteggio = c.execute('SELECT COUNT(ID) FROM Viaggi').fetchone()[0]
        items = []
        for p in c.execute("SELECT Customer_code FROM Customers "):
            items.append(p[0])         
        for row in c.execute("SELECT * FROM Viaggi "):
            combo = QComboBox()
            combo.addItems(items)
            # ...
            self.tabella_registrazioni.setCellWidget(tablerow, 4, combo)