Qt调用QTableWidget.setModel()触发私有方法错误的解决咨询
问题解决:QTableWidget.setModel() 私有方法错误
错误根源
QTableWidget 是Qt封装好的自带数据模型的表格控件,它的setModel()是私有方法,不能用来设置外部的QSqlRelationalTableModel。要配合SQL模型展示数据,你需要用QTableView控件。
解决方案
方案1:修改UI文件(推荐)
打开你的MitarbeiterWindow.ui文件,找到table_mitarbeiter控件,将其类型从QTableWidget改为QTableView,然后调整代码移除冗余初始化:
class MitarbeiterWindow(QMainWindow): def __init__(self): super(MitarbeiterWindow, self).__init__() loadUi("ui/MitarbeiterWindow.ui", self) print("----Mitarbeiterverwaltung geöffnet") self.mod_mitarbieter = QtSql.QSqlRelationalTableModel() self.mod_mitarbieter.setTable("Mitarbeiter") self.mod_mitarbieter.select() self.table_mitarbeiter.setModel(self.mod_mitarbieter)
方案2:不修改UI,手动填充QTableWidget数据
如果不想改动UI文件,可以从SQL模型中读取数据,逐个添加到QTableWidget中:
class MitarbeiterWindow(QMainWindow): def __init__(self): super(MitarbeiterWindow, self).__init__() loadUi("ui/MitarbeiterWindow.ui", self) print("----Mitarbeiterverwaltung geöffnet") self.load_mitarbeiter() def load_mitarbeiter(self): model = QtSql.QSqlRelationalTableModel() model.setTable("Mitarbeiter") model.select() # 清空表格并初始化结构 self.table_mitarbeiter.clear() self.table_mitarbeiter.setColumnCount(model.columnCount()) # 设置表头 header_labels = [model.headerData(i, QtCore.Qt.Horizontal) for i in range(model.columnCount())] self.table_mitarbeiter.setHorizontalHeaderLabels(header_labels) # 逐行填充数据 for row_idx in range(model.rowCount()): self.table_mitarbeiter.insertRow(row_idx) for col_idx in range(model.columnCount()): cell_data = str(model.data(model.index(row_idx, col_idx))) item = QtWidgets.QTableWidgetItem(cell_data) self.table_mitarbeiter.setItem(row_idx, col_idx, item) # 自适应列宽 self.table_mitarbeiter.resizeColumnsToContents()
额外注意点
你的__init__方法里重复调用了QtWidgets.QMainWindow.__init__(self),这会覆盖之前的初始化操作,必须删除这一行,否则可能导致UI加载异常。
内容的提问来源于stack exchange,提问作者Manuel Jellitsch
相关产品推荐
相关产品推荐

