如何调整QTableWidget中QIcon的位置?点击按钮将图标置于文本旁
问题描述
我想把QIcon设置在QTableWidgetItem的文本旁边,尝试用StyledItemDelegate的initStyleOption方法,但图标被放到了单元格末尾:
def initStyleOption(self, option: QStyleOptionViewItem, index) -> None: if index.column() == 0: option.decorationPosition = QStyleOptionViewItem.Right return super().initStyleOption(option, index)
我想要实现图标紧邻文本的效果,请问点击QPushButton时,怎么设置QIcon让它位于QTableWidgetItem的文本旁边?以下是测试代码:
import sys from PySide2.QtGui import * from PySide2.QtWidgets import * class MyApp(QMainWindow): def __init__(self): super().__init__() self.setGeometry(200, 300, 500, 500) # QTableWidget self.tableWidget = QTableWidget(self) self.tableWidget.setColumnCount(2) self.tableWidget.setMinimumSize(400, 400) # QIcon self.icon: QIcon = QIcon("pencil.png") self.icon2: QIcon = QIcon("Check.png") # pushButton self.button = QPushButton(self) self.button.setGeometry(450, 450, 50, 50) self.button.setText('Edit') self.button.clicked.connect(self.markItem) self.show() for i in range(3): self.tableWidget.insertRow(i) for j in range(2): if j == 1: self.tableWidget.setItem(i, j, QTableWidgetItem(self.icon2, '0')) else: self.tableWidget.setItem(i, j, QTableWidgetItem(QIcon(), f"{i * 58}")) def setIcon(self) -> None: tableWidgetItem: QTableWidgetItem = self.tableWidget.currentItem() col = tableWidgetItem.column() if col == 0: tableWidgetItem.setIcon(self.icon) if __name__ == '__main__': app = QApplication(sys.argv) ex = MyApp() sys.exit(app.exec_())
解决方案
要实现图标紧邻文本的效果,需要自定义StyledItemDelegate,除了设置图标位置,还要调整对齐方式和文本图标间距,同时修正按钮的信号关联:
1. 自定义Delegate控制图标显示
class IconTextDelegate(QStyledItemDelegate): def initStyleOption(self, option: QStyleOptionViewItem, index) -> None: super().initStyleOption(option, index) # 针对第0列设置图标在文本右侧,且和文本一起靠左对齐 if index.column() == 0: option.decorationPosition = QStyleOptionViewItem.Right option.decorationAlignment = Qt.AlignVCenter | Qt.AlignLeft option.decorationSize = QSize(16, 16) # 按需调整图标大小 option.textMargin = 4 # 缩小文本与图标间的空白,实现紧邻效果
2. 修改主窗口代码应用Delegate
import sys from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtCore import Qt class IconTextDelegate(QStyledItemDelegate): def initStyleOption(self, option: QStyleOptionViewItem, index) -> None: super().initStyleOption(option, index) if index.column() == 0: option.decorationPosition = QStyleOptionViewItem.Right option.decorationAlignment = Qt.AlignVCenter | Qt.AlignLeft option.decorationSize = QSize(16, 16) option.textMargin = 4 class MyApp(QMainWindow): def __init__(self): super().__init__() self.setGeometry(200, 300, 500, 500) self.tableWidget = QTableWidget(self) self.tableWidget.setColumnCount(2) self.tableWidget.setMinimumSize(400, 400) # 给第0列应用自定义Delegate self.tableWidget.setItemDelegateForColumn(0, IconTextDelegate(self.tableWidget)) self.icon: QIcon = QIcon("pencil.png") self.icon2: QIcon = QIcon("Check.png") self.button = QPushButton(self) self.button.setGeometry(450, 450, 50, 50) self.button.setText('Edit') # 修正信号关联,关联到已实现的setIcon方法 self.button.clicked.connect(self.setIcon) self.show() for i in range(3): self.tableWidget.insertRow(i) for j in range(2): if j == 1: self.tableWidget.setItem(i, j, QTableWidgetItem(self.icon2, '0')) else: self.tableWidget.setItem(i, j, QTableWidgetItem(QIcon(), f"{i * 58}")) def setIcon(self) -> None: tableWidgetItem = self.tableWidget.currentItem() if not tableWidgetItem: return col = tableWidgetItem.column() if col == 0: tableWidgetItem.setIcon(self.icon) if __name__ == '__main__': app = QApplication(sys.argv) ex = MyApp() sys.exit(app.exec_())
关键说明
decorationAlignment设置为AlignVCenter | AlignLeft,让图标和文本一起靠左对齐,避免图标跑到单元格右边缘。textMargin直接缩小文本与图标之间的空白,实现紧邻效果。- 修正了按钮的信号关联,原代码中
markItem方法未定义,改为关联已实现的setIcon方法。
内容的提问来源于stack exchange,提问作者JeongHyeon Moon
相关产品推荐
相关产品推荐

