SS_Rebelious
SS_Rebelious

Reputation: 1364

Unable to populate QTableWidget

I'm trying to populate QTableWidget (set up number of rows and columns, add column names and add data to cells), but the widget appears empty and no errors are thrown.

Here is the working example, see class TableForm():

from PyQt4 import QtCore, QtGui


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_TableForm(object):
    def setupUi(self, TableForm):
        TableForm.setObjectName(_fromUtf8("TableForm"))
        TableForm.resize(495, 506)
        TableForm.setLocale(QtCore.QLocale(QtCore.QLocale.Russian, QtCore.QLocale.RussianFederation))
        self.verticalLayout = QtGui.QVBoxLayout(TableForm)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.table_widget = QtGui.QTableWidget(TableForm)
        self.table_widget.setRowCount(0)
        self.table_widget.setColumnCount(0)
        self.table_widget.setObjectName(_fromUtf8("table_widget"))
        self.verticalLayout.addWidget(self.table_widget)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.start_edit_button = QtGui.QPushButton(TableForm)
        self.start_edit_button.setObjectName(_fromUtf8("start_edit_button"))
        self.horizontalLayout.addWidget(self.start_edit_button)
        self.save_edits_buttonBox = QtGui.QDialogButtonBox(TableForm)
        self.save_edits_buttonBox.setEnabled(False)
        self.save_edits_buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
        self.save_edits_buttonBox.setObjectName(_fromUtf8("save_edits_buttonBox"))
        self.horizontalLayout.addWidget(self.save_edits_buttonBox)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.retranslateUi(TableForm)
        QtCore.QMetaObject.connectSlotsByName(TableForm)

    def retranslateUi(self, TableForm):
        TableForm.setWindowTitle(_translate("TableForm", "Таблица", None))
        self.start_edit_button.setText(_translate("TableForm", "Редактировать", None))




class TableForm(QtGui.QDialog, Ui_TableForm):


  def __init__(self):
    super(TableForm, self).__init__()
    self.ui = Ui_TableForm()
    self.ui.setupUi(self)
    data = [['name1', 'name2'], {'name1':[1], 'name2':[2]}, 2]
    col_names = data[0]
    col_data = data[1]
    rows = data[2] + 1
    cols = len(col_names)
    self.ui.table_widget.setRowCount(rows)
    self.ui.table_widget.setColumnCount(cols)
    self.ui.table_widget.setHorizontalHeaderLabels(col_names)
    n = 0
    for key in col_names:
      m = 0
      for item in col_data[key]:
        newitem = QtGui.QTableWidgetItem(item)
        self.ui.table_widget.setItem(m, n, newitem)
        m += 1
      n += 1


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    dialog = QtGui.QDialog()
    u = TableForm()
    u.setupUi(dialog)
    dialog.show()
    sys.exit(app.exec_())

What is wrong?

Upvotes: 1

Views: 177

Answers (1)

ekhumoro
ekhumoro

Reputation: 120768

You're mixing up several different ways of adding the ui to the dialog. The table population is overwritten by the second call to setupUi, which resets the rows and columns back to zero.

I have fixed this in the code below, and also corrected some other issues (see the comments):

# no need to inherit Ui_TableForm
class TableForm(QtGui.QDialog):
  def __init__(self):
    super(TableForm, self).__init__()
    self.ui = Ui_TableForm()
    self.ui.setupUi(self)
    data = [['name1', 'name2'], {'name1':[1], 'name2':[2]}, 2]
    col_names = data[0]
    col_data = data[1]
    rows = data[2] + 1
    cols = len(col_names)
    self.ui.table_widget.setRowCount(rows)
    self.ui.table_widget.setColumnCount(cols)
    self.ui.table_widget.setHorizontalHeaderLabels(col_names)
    # use enumerate
    for n, key in enumerate(col_names):
      for m, item in enumerate(col_data[key]):
        # item content must always be strings
        newitem = QtGui.QTableWidgetItem(str(item))
        self.ui.table_widget.setItem(m, n, newitem)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    # ui setup is all done in __init__
    dialog = TableForm()
    dialog.show()
    sys.exit(app.exec_())

Upvotes: 1

Related Questions