Reputation: 1364
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
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