【发布时间】:2021-12-31 17:16:53
【问题描述】:
所以我有一个包含 1 行和多列的表格,并且我使用自定义委托函数作为图像缩略图。单击它时,我还包括了设置背景颜色功能。但是,它不会更改项目背景的颜色。我必须使用自定义委托功能,以便我的图标图像从不同的单元格相互粘连,之间没有任何额外的空格。
我的代码如下
import random
from PyQt5 import QtCore, QtGui, QtWidgets
imagePath2 = "arrowREDHead.png"
imagePath = "arrowREDBody.png"
class IconDelegate(QtWidgets.QStyledItemDelegate):
def paint(self, painter, option, index):
icon = index.data(QtCore.Qt.DecorationRole)
mode = QtGui.QIcon.Normal
if not (option.state & QtWidgets.QStyle.State_Enabled):
mode = QtGui.QIcon.Disabled
elif option.state & QtWidgets.QStyle.State_Selected:
mode = QtGui.QIcon.Selected
state = (
QtGui.QIcon.On
if option.state & QtWidgets.QStyle.State_Open
else QtGui.QIcon.Off
)
pixmap = icon.pixmap(option.rect.size(), mode, state)
painter.drawPixmap(option.rect, pixmap)
def sizeHint(self, option, index):
return QtCore.QSize(20, 20)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
table = QtWidgets.QTableWidget(1, 10)
delegate = IconDelegate(table)
table.setItemDelegate(delegate)
self.setCentralWidget(table)
for j in range(table.columnCount()):
if(j % 2 == 0):
pixmap = QtGui.QPixmap(imagePath)
icon = QtGui.QIcon(pixmap)
it = QtWidgets.QTableWidgetItem()
it.setIcon(icon)
table.setItem(0, j, it)
else:
pixmap = QtGui.QPixmap(imagePath2)
icon = QtGui.QIcon(pixmap)
it = QtWidgets.QTableWidgetItem()
it.setIcon(icon)
table.setItem(0, j, it)
table.item(0, 1).setBackground(QtGui.QColor(100,100,150))
table.resizeRowsToContents()
table.resizeColumnsToContents()
table.setShowGrid(False)
table.itemClicked.connect(self.sequenceClicked)
def sequenceClicked(self, item):
self.itemClicked = item
print("item", item)
item.setBackground(QtGui.QColor(255, 215, 0))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
这是图标之间有间隙的图像,它形成的箭头看起来并不完美,这就是为什么我使用自定义委托函数将图标粘在一起并让它看起来像一个完美的箭头
这是具有完美箭头外观的图像,因为它使用委托函数在单元格之间没有任何间隙。但是,它不允许我更改单元格的背景颜色。
这是箭头的图像
这是箭头的图像
【问题讨论】:
-
您完全覆盖了项目的绘制,因为现在您只绘制像素图,而忽略其他任何内容。您对油漆覆盖的解释也有点不清楚:“使我的图标图像从不同的单元格相互粘连”是什么意思?您能否提供您正在使用的示例图片以便我们更好地理解?
-
我在上面添加了两张图片。第一张图片显示了我必须使用委托函数的原因,因为两者之间存在间隙,以便它可以覆盖单元格填充并将其变成箭头而没有任何间隙,如图 2 所示。但是,有没有可能的方法来即使在我用委托函数覆盖它之后,单击时也会以某种方式更改单元格的背景颜色?
-
拥有实际图像会有所帮助,因为问题可能与它们的纵横比有关。
-
抱歉,不太清楚你的意思,你想看实际图像还是?因为我尝试使用 setIconsize 设置图像的不同纵横比,甚至设置它的缩放比例,但它不起作用。这就是我使用自定义委托函数的原因,但问题是我想在单击时实现特定单元格的更改颜色,但我想不出使用委托函数的方法
-
我指的是箭头图像。我可以提供一个解决方案,但是拥有这些图像会更好地确保它按您的预期正常工作。根据操作系统和风格,项目可以以非常不同的方式绘制,装饰(图标)可以有不同的边距和对齐方式。有多种可能的方法,但更好的是那些主要使用默认实现的方法,因此拥有这些图像是必不可少的,特别是如果它们没有相同的大小或比例,因为正确对齐对于您的情况是强制性的。跨度>
标签: python pyqt5 qt5 qtablewidget