使用 QItemDelegate 在 PyQt5 的 table 中显示图标代替文本
Using QItemDelegate to show icons in place of text in a table in PyQt5
对于 PyQt5,我正在尝试使用 QItemDelegate 在 table 的单元格中显示图标而不是文本字符串。本质上,我使用以下方法构建了 QItemDelegate 的子类:
de = MyDelegate(self.attribute_table_view)
这里dself.attribute_table_view
是一个`QTableView'对象。
我尝试使用以下方法在特定列的每个单元格中绘制一个图标:
class MyDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
QItemDelegate.__init__(self, parent, *args)
def paint(self, painter, option, index):
painter.save()
value = index.data(Qt.DisplayRole)
line_1x = QPixmap('line_1x.png')
painter.setBrush(Qt.gray)
painter.setPen(Qt.black)
painter.drawPixmap(QRectF(0, 0, 48, 24), line_1x, QRectF(0, 0, 48, 24))
painter.restore()
使用 painter.drawPixmap()
如何告诉它在 table 中的每个单元格中绘制,就像使用 painter.drawText(option.rect, Qt.AlignVCenter, value)
实现的那样?
另外,我注意到如果我输入的文件名对于 .png 文件不存在,我当前的脚本不会报告任何错误。 .png文件不存在应该报错吗?
我当前的模型是 QgsAttributeTableModel,我想用图标呈现一列中所有单元格的当前字符串值,其中使用的图标取决于字符串值。
在这个回答中我会展示几种方法,你可以根据问题的复杂程度来选择。
1。图标数量固定,一栏重复使用
逻辑是加载一次图标,并将其作为属性传递给委托,然后根据您的逻辑,您可以获取列表的图标,因为它修改了 get_icon()
方法。然后我们通过QIcon的paint()
方法绘制图标。
class MyDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, icons, parent=None):
super(MyDelegate, self).__init__(parent)
self._icons = icons
def get_icon(self, index):
# get the icon according to the condition:
# In this case, for example,
# the icon will be repeated periodically
icon = self._icons[ index.row() % len(self._icons) ]
return icon
def paint(self, painter, option, index):
icon = self.get_icon(index)
icon.paint(painter, option.rect, QtCore.Qt.AlignCenter)
如何重用列必须使用setItemDelegateForColumn()
方法将委托设置为列
self.attribute_table_view = QtWidgets.QTableView()
self.attribute_table_view.setModel(your_model)
column_icon = 1
icons = [QtGui.QIcon(QtCore.QDir.current().absoluteFilePath(name)) for name in ["clear.png", "heart.png","marker.png", "pen.png"]]
delegate = MyDelegate(icons, self.attribute_table_view)
self.attribute_table_view.setItemDelegateForColumn(column_icon, delegate)
我注意到如果我输入 .png 文件不存在的文件名,我当前的脚本不会报告任何错误。如果.png文件不存在会报错吗?
如果文件不存在,Qt 不会通知,你必须验证,例如用 isNull()
函数。通知方式有2种:
1. 第一个是 return 一个布尔值,指示是否加载数据,但是当使用构造函数时,它只 return 构造对象并抛出。
- 启动异常,这会消耗许多 Qt 认为不必要的资源,因此您永远不会使用它。
另一种特别是 Qt 通知错误的方式是通过信号,但这些仅适用于 QObject 和 QIcon,QPixmap,QImage 不是 QObjects。
总之,验证与否的责任落在了开发者身上。
对于 PyQt5,我正在尝试使用 QItemDelegate 在 table 的单元格中显示图标而不是文本字符串。本质上,我使用以下方法构建了 QItemDelegate 的子类:
de = MyDelegate(self.attribute_table_view)
这里dself.attribute_table_view
是一个`QTableView'对象。
我尝试使用以下方法在特定列的每个单元格中绘制一个图标:
class MyDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
QItemDelegate.__init__(self, parent, *args)
def paint(self, painter, option, index):
painter.save()
value = index.data(Qt.DisplayRole)
line_1x = QPixmap('line_1x.png')
painter.setBrush(Qt.gray)
painter.setPen(Qt.black)
painter.drawPixmap(QRectF(0, 0, 48, 24), line_1x, QRectF(0, 0, 48, 24))
painter.restore()
使用 painter.drawPixmap()
如何告诉它在 table 中的每个单元格中绘制,就像使用 painter.drawText(option.rect, Qt.AlignVCenter, value)
实现的那样?
另外,我注意到如果我输入的文件名对于 .png 文件不存在,我当前的脚本不会报告任何错误。 .png文件不存在应该报错吗?
我当前的模型是 QgsAttributeTableModel,我想用图标呈现一列中所有单元格的当前字符串值,其中使用的图标取决于字符串值。
在这个回答中我会展示几种方法,你可以根据问题的复杂程度来选择。
1。图标数量固定,一栏重复使用
逻辑是加载一次图标,并将其作为属性传递给委托,然后根据您的逻辑,您可以获取列表的图标,因为它修改了 get_icon()
方法。然后我们通过QIcon的paint()
方法绘制图标。
class MyDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, icons, parent=None):
super(MyDelegate, self).__init__(parent)
self._icons = icons
def get_icon(self, index):
# get the icon according to the condition:
# In this case, for example,
# the icon will be repeated periodically
icon = self._icons[ index.row() % len(self._icons) ]
return icon
def paint(self, painter, option, index):
icon = self.get_icon(index)
icon.paint(painter, option.rect, QtCore.Qt.AlignCenter)
如何重用列必须使用setItemDelegateForColumn()
方法将委托设置为列
self.attribute_table_view = QtWidgets.QTableView()
self.attribute_table_view.setModel(your_model)
column_icon = 1
icons = [QtGui.QIcon(QtCore.QDir.current().absoluteFilePath(name)) for name in ["clear.png", "heart.png","marker.png", "pen.png"]]
delegate = MyDelegate(icons, self.attribute_table_view)
self.attribute_table_view.setItemDelegateForColumn(column_icon, delegate)
我注意到如果我输入 .png 文件不存在的文件名,我当前的脚本不会报告任何错误。如果.png文件不存在会报错吗?
如果文件不存在,Qt 不会通知,你必须验证,例如用 isNull()
函数。通知方式有2种:
1. 第一个是 return 一个布尔值,指示是否加载数据,但是当使用构造函数时,它只 return 构造对象并抛出。
- 启动异常,这会消耗许多 Qt 认为不必要的资源,因此您永远不会使用它。
另一种特别是 Qt 通知错误的方式是通过信号,但这些仅适用于 QObject 和 QIcon,QPixmap,QImage 不是 QObjects。
总之,验证与否的责任落在了开发者身上。