2015-06-03 4 views
1

Я пытаюсь заполнить QTableWidget (установить количество строк и столбцов, добавить имена столбцов и добавить данные в ячейки), но виджет выглядит пустым и никаких ошибок не возникает.Не удалось заполнить QTableWidget

Вот рабочий пример, см класс 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_()) 

Что не так?

ответ

1

Вы смешиваете несколько разных способов добавления ui в диалог. Население таблицы перезаписывается вторым вызовом setupUi, который сбрасывает строки и столбцы обратно на ноль.

Я установил это в коде ниже, а также исправлены некоторые другие вопросы (см комментарии):

# 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_()) 
+0

Спасибо за помощь, но у меня есть еще один вопрос. Причина другого вызова 'setupUi' была единственным способом, с помощью которого я открыл запуск функции« TableForm() »из функции. Рассмотрим функцию 'def showTab(): dialog = TableForm() \ dialog.show()'. Если 2-я и 3-я строки внизу кода заменены на 'showTab()', виджет не появится вообще. Как я могу называть 'TableForm()' функцией? –

+0

Хорошо, я понял: в 'showTab()' Я должен добавить строку 'd = dialog.exec _()'. –