PyQt中QTableWidget单元格过长时如何从开头截断而非末尾?
实现QTableWidget单元格文本从开头截断显示
可行,你可以通过自定义QStyledItemDelegate来实现需求,以下是两种实用方案:
方案一:通用文本左截断(适配任意文本)
利用Qt内置的文本省略模式,实现单元格文本过长时从开头截断,自动保留末尾内容并添加省略号,且会随列宽变化自动调整显示效果:
from PyQt5.QtWidgets import QStyledItemDelegate, QTableWidget, QTableWidgetItem, QApplication, QWidget from PyQt5.QtCore import Qt class LeftElideDelegate(QStyledItemDelegate): def paint(self, painter, option, index): # 复制样式选项避免修改原对象 opt = option.copy() # 设置文本省略模式为从左侧截断 opt.textElideMode = Qt.ElideLeft super().paint(painter, opt, index) # 使用示例 if __name__ == "__main__": app = QApplication([]) window = QWidget() table = QTableWidget(2, 1, window) table.setItem(0, 0, QTableWidgetItem("/home/user/documents/projects/pana/someverylongblablabla.ext")) table.setItem(1, 0, QTableWidgetItem("/long/path/to/another/verylongfilenamewithoutextension")) # 给目标列绑定自定义代理 table.setItemDelegateForColumn(0, LeftElideDelegate()) table.resizeColumnToContents() window.show() app.exec_()
方案二:路径专属智能截断(保留关键路径段)
如果展示的都是文件路径,想要精准保留最后N段目录+文件名(比如示例中的.../pana/someverylongblablabla.ext),可以手动处理路径字符串:
from PyQt5.QtWidgets import QStyledItemDelegate, QTableWidget, QTableWidgetItem, QApplication, QWidget import os class PathLeftElideDelegate(QStyledItemDelegate): def displayText(self, text, locale): # 保留最后2段路径(可根据需求修改段数) parts = text.split(os.sep) if len(parts) > 2: return f"...{os.sep}{os.sep.join(parts[-2:])}" return text # 使用示例 if __name__ == "__main__": app = QApplication([]) window = QWidget() table = QTableWidget(2, 1, window) table.setItem(0, 0, QTableWidgetItem("/home/user/documents/projects/pana/someverylongblablabla.ext")) table.setItem(1, 0, QTableWidgetItem("/long/path/to/another/verylongfilenamewithoutextension")) table.setItemDelegateForColumn(0, PathLeftElideDelegate()) table.resizeColumnToContents() window.show() app.exec_()
注意事项
- 方案一适配性更强,列宽变化时会自动重新计算显示内容;
- 方案二更贴合路径场景,能保证展示关键的目录和文件名,若需结合列宽动态判断是否截断,可在
paint方法中通过opt.rect.width()结合字体宽度计算实现。
内容的提问来源于stack exchange,提问作者user206904
相关产品推荐
相关产品推荐

