Handling multiple QComboBox in one cell widget

97 Views Asked by At

Code:

class Example(QtGui.QWidget):
    def __init__(self, parent):
        super(Accounts, self).__init__()
        self.initUI()

    def initUI(self):
        self.table = QtGui.QTableWidget()
        self.table.setColumnCount(5)

        database = 'Setting.db'
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute('''
                                SELECT ID, User, Text
                                FROM Data ''')


        data = cursor.fetchall()
        num = 0
        for row in data:
            self.table.setRowCount(num+2)
            self.table.setItem(num, 0, QtGui.QTableWidgetItem(str(row[0])))
            self.table.setItem(num, 1, QtGui.QTableWidgetItem(str(row[1])))
            self.table.setItem(num, 2, QtGui.QTableWidgetItem(str(row[2])))
            self.table.setCellWidget(num, 3, Perms(self, row[0]))

            save_user = QtGui.QPushButton("Save")
            save_user.clicked.connect(self.save)

            self.table.setCellWidget(num, 5, save_user)

            num= num+1

        main_layout = QtGui.QGridLayout()
        main_layout.addWidget(self.table)
        self.setLayout(main_layout)

    def save(self):
        button = self.sender()
        index = self.table.indexAt(button.pos())
        row = index.row()
        a_id = str(self.table.item(row, 0).text())
        data = Permissions(self, a_id).update_database()

class Perms(QtGui.QWidget):
    def __init__(self, parent, a_id):
        super(Perms, self).__init__()
        self.a_id = a_id
        self.init_ui()

    def init_ui(self):
        database = 'Settings.db'
        conn = sqlite3.connect(database)
        cursor = conn.cursor()

        cursor.execute('''
                                SELECT control, sub
                                FROM Perms
                                WHERE ID= ?''', (self.a_id,))

        row = cursor.fetchone()

        control_label = QtGui.QLabel("Control")
        sub_label = QtGui.QLabel("Sub")

        self.control_options = QtGui.QComboBox()
        self.control_options.addItem("Y")
        self.control_options.addItem("N")
        if str(row[0]) == "Y":
            self.control_options.setCurrentIndex(0)
        else:
            self.control_options.setCurrentIndex(1)

        self.sub_options = QtGui.QComboBox()
        self.sub_options.addItem("Y")
        self.sub_options.addItem("N")
        if str(row[1]) == "Y":
            self.sub_options.setCurrentIndex(0)
        else:
            self.sub_options.setCurrentIndex(1)

        layout = QtGui.QGridLayout()

        layout.addWidget(full_control_label, 1, 1)
        layout.addWidget(self.full_control_options, 1, 2)

        layout.addWidget(tills_label, 2, 1)
        layout.addWidget(self.tills_options, 2, 2)

        self.setLayout(layout)

    def update_database(self):
        control = str(self.control_options.currentText())
        sub = str(self.sub_options.currentText())
        return (control, sub)

Ignore any errors I don't specify because I wrote this quickly just for an example. The problem I'm facing is: the save button is created within the loop in order to be used multiple times. It connects to a function that gets the current text of the combo-boxes. But the problem is, if you change the current text in the combo-boxes and then click Save, it gets the text from the combo-boxes, but not the right text - you always get the same result.

For example:

QComboBox1: Y
QComboBox2: N

If we click Save, it'll return ('Y', 'N')

If we change the combobox values:

QComboBox1: N
QComboBox2: N

and click save, it'll return ('Y', 'N')

But it never returns the new values from the combo-boxes.

How can I fix it so I get the updated values rather than the old values?

1

There are 1 best solutions below

0
On BEST ANSWER

The save method doesn't currently make much sense. Surely you need to get the Perm widget from the table, not make a new one every time:

def save(self):
    button = self.sender()
    index = self.table.indexAt(button.pos())
    row = index.row()
    # get the new values from the table
    data = self.table.cellWidget(row, 3).update_database()