QComboBox only gives first item

Viewed 30

I have some troubles with a QComboBox() when I want to read out the actual text from it. The ComboBox is created dynamically, so I use the exec() function from python to create them. I see the ComboBoxes in my layout - but so far so good - when I read the Data out from them, I only get returned the first value of the ComboBox, not the actual selected. I have tried it with .currentText() and .currentIndex()

As you see in my code snipped in the upper part - I create zu QComboBox with the exec function (the program is used to import data on a Database, so, I create QComboBoxes, as much as Database-Tableccolumns I have and so much entries, Import-Tablecolumns I have.

I create the ComboBox with startin CB_,and the I look for attributes starting with CB and run their function.

But I have no clue, what is wrong..

Here is my code:

self.layoutscroll = QVBoxLayout()
self.widgetscroll = QWidget()
self.widgetscroll.setLayout(self.layoutscroll)

self.nextbutton.setEnabled(True)
self.nextbutton.clicked.connect(self.uploaddatatodb)

self.scroll.setWidget(self.widgetscroll)
self.layoutbox.addWidget(self.scroll)

for col in dfdb.columns:
    exec("self.groupbox_{0} = QGroupBox('Datenbank: {0}')".format(str(col)))
    exec("self.groupbox_{0}_layout = QVBoxLayout()".format(str(col)))
    exec("self.CB_{0} = QComboBox(self)".format(str(col)))
    exec("for importcol in self.dfimport.columns:\n\tself.CB_{0}.addItem(str(importcol))".format(str(col)))
    exec("self.groupbox_{0}_layout.addWidget(self.CB_{0})".format(str(col)))
    exec("self.groupbox_{0}.setLayout(self.groupbox_{0}_layout)".format(str(col)))
    exec("self.layoutscroll.addWidget(self.groupbox_{0})".format(str(col)))


def uploaddatatodb(self):
    print("hallo")
    self.nextbutton.setEnabled(False)
    comparedf = pd.DataFrame()
    dblist = [a for a in dir(self) if a.startswith('groupbox_') and not a.endswith('layout')]
    importlist = [a for a in dir(self) if a.startswith('CB_')]
    for idx,x in enumerate(importlist):
        exec("str(x)")
        exec("val=str(self."+str(x)+".currentText())")
        exec("print(val)")
        exec("importlist["+str(idx)+"]=val")


    for i in range(len(dblist)):
        comparedf = comparedf.append({"db":dblist[i][9:],"import":importlist[i]},ignore_index=True)

    print(comparedf)

EDIT:

I have updated my code to get away from the exec() function - but I have the same error: When I want to read out the comboboxes - everytime I get only the first value of the combobox:

self.layoutscroll = QVBoxLayout()
self.widgetscroll = QWidget()
self.widgetscroll.setLayout(self.layoutscroll)

self.nextbutton.setEnabled(True)
self.nextbutton.clicked.connect(self.uploaddatatodb)

self.scroll.setWidget(self.widgetscroll)
self.layoutbox.addWidget(self.scroll)

for col in dfdb.columns:
    combo = QComboBox()
    combo.addItems(self.dfimport.columns)
    groupbox_DB_lyt = QVBoxLayout()
    groupbox_DB = QGroupBox(str("Datenbank: "+col))
    groupbox_DB_lyt.addWidget(combo)
    groupbox_DB.setLayout(groupbox_DB_lyt)
    self.layoutscroll.addWidget(groupbox_DB)



def uploaddatatodb(self):
    self.nextbutton.setEnabled(False)

    for i in range(self.layoutscroll.count()):
        dblist = self.layoutscroll.itemAt(i).widget().title()
        importlist = self.layoutscroll.itemAt(i).widget().layout().itemAt(0).widget().currentText()
        print(dblist,importlist)

With print I get over the iteration all Groupbox Titles, but only the first QComboBoxes first Text.

0 Answers
Related