如何为PyQt QTableWidget指定列设置固定宽度并实现文本自动换行
实现方案
要实现QTableWidget指定列固定宽度+文本自动换行,只需添加以下核心配置即可:
- 关闭最后一列自动拉伸:原代码中的
setStretchLastSection(True)会覆盖固定宽度设置,需要改为False - 为指定列设置固定宽度:调用
setColumnWidth(列索引, 宽度值)设置目标列的固定尺寸,可根据需求调整宽度数值 - 开启全局自动换行:调用
setWordWrap(True)允许单元格内文本超出宽度后自动换行 - 行高自动适配内容:设置垂直表头的Resize模式为
ResizeToContents,让行高自动跟随换行后的文本高度变化,避免内容被截断 - (可选)前两列设置为内容自适应宽度,整体排版更美观
你可以将上述配置添加到setupUi方法中tableWidget初始化完成的位置,或者retranslateUi方法的末尾,示例修改后的完整代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(3) self.tableWidget.setRowCount(6) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(0, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(0, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(0, 2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(1, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(1, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(1, 2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(2, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(2, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(2, 2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(3, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(3, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(3, 2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(4, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(4, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(4, 2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(5, 0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(5, 1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(5, 2, item) self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) # 关闭最后一列自动拉伸 self.tableWidget.horizontalHeader().setStretchLastSection(False) # 以下为新增配置 # Description列索引为2,设置固定宽度450,可自行调整数值 self.tableWidget.setColumnWidth(2, 450) # 开启单元格文本自动换行 self.tableWidget.setWordWrap(True) # 行高自动适配文本内容 self.tableWidget.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) # 前两列自适应内容宽度,可选 self.tableWidget.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) self.tableWidget.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) item = self.tableWidget.verticalHeaderItem(0) item.setText(_translate("MainWindow", "1")) item = self.tableWidget.verticalHeaderItem(1) item.setText(_translate("MainWindow", "2")) item = self.tableWidget.verticalHeaderItem(2) item.setText(_translate("MainWindow", "3")) item = self.tableWidget.verticalHeaderItem(3) item.setText(_translate("MainWindow", "4")) item = self.tableWidget.verticalHeaderItem(4) item.setText(_translate("MainWindow", "5")) item = self.tableWidget.verticalHeaderItem(5) item.setText(_translate("MainWindow", "6")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Name")) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Quantity")) item = self.tableWidget.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Description")) __sortingEnabled = self.tableWidget.isSortingEnabled() self.tableWidget.setSortingEnabled(False) item = self.tableWidget.item(0, 0) item.setText(_translate("MainWindow", "Pawn")) item = self.tableWidget.item(0, 1) item.setText(_translate("MainWindow", "8")) item = self.tableWidget.item(0, 2) item.setText(_translate("MainWindow", "The pawn is the least powerful piece and is worth one point. If it is a pawn's first move, it can move forward one or two squares. If a pawn has already moved, then it can move forward just one square at a time.")) item = self.tableWidget.item(1, 0) item.setText(_translate("MainWindow", "Knight")) item = self.tableWidget.item(1, 1) item.setText(_translate("MainWindow", "2")) item = self.tableWidget.item(1, 2) item.setText(_translate("MainWindow", "The knight is considered a minor piece (like a bishop) and is worth three points. The knight is the only piece in chess that can jump over another piece!")) item = self.tableWidget.item(2, 0) item.setText(_translate("MainWindow", "Bishop")) item = self.tableWidget.item(2, 1) item.setText(_translate("MainWindow", "2")) item = self.tableWidget.item(2, 2) item.setText(_translate("MainWindow", "The bishop is considered a minor piece (like a knight) and is worth three points. A bishop can move diagonally as many squares as it likes, as long as it is not blocked by its own pieces or an occupied square. ")) item = self.tableWidget.item(3, 0) item.setText(_translate("MainWindow", "Rook")) item = self.tableWidget.item(3, 1) item.setText(_translate("MainWindow", "2")) item = self.tableWidget.item(3, 2) item.setText(_translate("MainWindow", "The rook is considered a major piece (like the queen) and is worth five points. It can move as many squares as it likes left or right horizontally, or as many squares as it likes up or down vertically (as long as it isn't blocked by other pieces).")) item = self.tableWidget.item(4, 0) item.setText(_translate("MainWindow", "Queen")) item = self.tableWidget.item(4, 1) item.setText(_translate("MainWindow", "1")) item = self.tableWidget.item(4, 2) item.setText(_translate("MainWindow", "The queen is considered a major piece (like a rook) and is worth nine points. It can move as many squares as it likes left or right horizontally, or as many squares as it likes up or down vertically (like a rook). ")) item = self.tableWidget.item(5, 0) item.setText(_translate("MainWindow", "King")) item = self.tableWidget.item(5, 1) item.setText(_translate("MainWindow", "1")) item = self.tableWidget.item(5, 2) item.setText(_translate("MainWindow", "The king is not a very powerful piece, as it can only move (or capture) one square in any direction. Please note that the king cannot be captured! When a king is attacked, it is called \"check.\"")) self.tableWidget.setSortingEnabled(__sortingEnabled) # 如果后续动态修改单元格内容,可调用下面方法刷新行高 # self.tableWidget.resizeRowsToContents() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
如果后续需要动态修改单元格内容,修改完成后调用self.tableWidget.resizeRowsToContents()即可刷新行高适配新的内容。
内容的提问来源于stack exchange,提问作者daniel ajj
相关产品推荐
相关产品推荐

