无法填充 QTableWidget
Unable to populate QTableWidget
我正在尝试填充 QTableWidget(设置行数和列数、添加列名并将数据添加到单元格),但该小部件显示为空并且未抛出任何错误。
这是工作示例,请参阅 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_())
怎么了?
您混淆了将 ui 添加到对话框的几种不同方法。 table 人口被第二次调用 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_())
我正在尝试填充 QTableWidget(设置行数和列数、添加列名并将数据添加到单元格),但该小部件显示为空并且未抛出任何错误。
这是工作示例,请参阅 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_())
怎么了?
您混淆了将 ui 添加到对话框的几种不同方法。 table 人口被第二次调用 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_())