Python 在「;图标";默认QListView中具有QAbstractListModel的项的空间?
考虑此示例,修改自: 导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类MyElement(对象): 定义初始化(self,numid): self.numid=numid self.strid=“Hello world{}”。格式(numid) 如果numid%2==0,则self.param='a',否则为'b' 定义报告(自我): return“(numid{},strid'{}',param'{}')。格式(self.numid,self.strid,self.param) elements=[MyElement(i)表示范围(20)内的i] 打印(元素) 类ElementListModel(QtCore.QAbstractListModel): 定义初始化(self,元素=[],父元素=无): super(ElementListModel,self)。\uuuu init self.\uu元素=元素 def行数(自身、父级): 返回len(自身元素) def数据(自身、索引、角色): thiselement=self.\u元素[index.row()] 如果角色==QtCore.Qt.DisplayRole: 返回str(thiseelement.strid) elif角色==QtCore.Qt.decoration角色: 返回QtGui.QColor(thiseelement.numid*10,thiseelement.numid,0) 类ElementThumbDelegate(QtWidgets.QStyledItemDelegate):#(QtGui.QStyledItemDelegate): def uuu init uuuu(self,view,parent=None): 超级(ElementThumbDelegate,self)。\uuuu初始化(父级) def油漆(自身、油漆工、选项、索引): 超级(ElementThumbDelegate,self).paint(画师、选项、索引) #painter.setRenderHint(QtGui.QPainter.Antialiasing) #painter.setPen(QtGui.QColor(255、255、255)) #画家。挫折(QtGui.QColor(10,10,10)) #painter.drawRect(options.rect) #painter.drawText(options.rect、QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter、str(index.data())) #def sizeHint(自身、选项、索引): #返回QtCore.QSize(50,50) def main(): app=qtwidts.QApplication(sys.argv) viewer=qtwidts.QListView() viewModel=ElementListModel(元素) viewer.setModel(viewModel) #viewer.setViewMode(QtWidgets.QListView.IconMode) viewer.setItemDelegate(ElementThumbDelegate(查看器)) viewer.show() sys.exit(app.exec_()) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main() 结果是: 请注意,默认情况下,项目左侧有一个框,您可以通过ListModel的Python 在「;图标";默认QListView中具有QAbstractListModel的项的空间?,python,pyqt5,Python,Pyqt5,考虑此示例,修改自: 导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类MyElement(对象): 定义初始化(self,numid): self.numid=numid self.strid=“Hello world{}”。格式(numid) 如果numid%2==0,则self.param='a',否则为'b' 定义报告(自我): return“(numid{},strid'{}',param'{}')。格式(self.numid,self.strid,self.p
data
方法中的DecorationRole
对其进行“着色”(显然,如果您返回的是QIcon而不是QColor,您也可以在该框中存储图标,但我从未尝试过)
我的问题是:
- 根据某些属性,如何在图标空间/框周围绘制边框?在上面的例子中,如果列表中给定元素的
,那么我希望在“图标空间/框”周围绘制一个2像素宽的浅蓝色(RGB:(38,76,100)或#62c2ff)边框,就像我在圆形区域的模型图像中手动绘制的一样;否则我就不想要边界了MyElement.param=='a'
- 根据某些属性,如何在该空格/方框的中心额外绘制一个字母?例如,如果列表中某个元素的<代码> MyElement.param=‘B’<代码>,那么我希望在“图标空间/框”的中间用白色书写的字母“B”——否则,我不希望在该空间中写入额外的文本。
ElementThumbDelegate的paint()方法应该已经足够成为如何实现这一点的指针;但是如果取消注释,您将看到整个项目都发生了更改,而不仅仅是左侧的图标框/空间。执行绘制的类是从DecorationRole角色获取信息以创建图标的委托,因此解决方案是根据项目信息创建自定义图标。该创建可以在模型或委托中完成,在本例中,我将使用第二个选项,但为此,必须通过自定义角色(如Qt.UserRole)公开该项:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class MyElement(object):
def __init__(self, numid):
self.numid = numid
self.strid = "Hello world {}".format(numid)
self.param = "a" if numid % 2 == 0 else "b"
def __repr__(self):
return "(numid {}, strid '{}', param '{}')".format(
self.numid, self.strid, self.param
)
elements = [MyElement(i) for i in range(20)]
class ElementListModel(QtCore.QAbstractListModel):
def __init__(self, elements=[], parent=None):
super(ElementListModel, self).__init__()
self.__elements = elements
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.__elements)
def data(self, index, role):
if not index.isValid() or not (0 <= index.row() < self.rowCount()):
return
thiselement = self.__elements[index.row()]
if role == QtCore.Qt.DisplayRole:
return str(thiselement.strid)
if role == QtCore.Qt.UserRole:
return thiselement
class ElementThumbDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super().initStyleOption(option, index)
thiselement = index.data(QtCore.Qt.UserRole)
if isinstance(thiselement, MyElement):
if thiselement.param == "a":
option.features |= QtWidgets.QStyleOptionViewItem.HasDecoration
pixmap = QtGui.QPixmap(option.decorationSize)
pixmap.fill(QtGui.QColor("#62c2ff"))
painter = QtGui.QPainter(pixmap)
color = QtGui.QColor(thiselement.numid * 10, thiselement.numid, 0)
painter.fillRect(pixmap.rect().adjusted(2, 2, -2, -2), color)
painter.end()
option.icon = QtGui.QIcon(pixmap)
if thiselement.param == "b":
option.features |= QtWidgets.QStyleOptionViewItem.HasDecoration
pixmap = QtGui.QPixmap(option.decorationSize)
color = QtGui.QColor(thiselement.numid * 10, thiselement.numid, 0)
pixmap.fill(color)
painter = QtGui.QPainter(pixmap)
painter.setPen(QtGui.QColor("white"))
painter.drawText(pixmap.rect(), QtCore.Qt.AlignCenter, "b")
painter.end()
option.icon = QtGui.QIcon(pixmap)
def main():
app = QtWidgets.QApplication(sys.argv)
viewer = QtWidgets.QListView()
viewModel = ElementListModel(elements)
viewer.setModel(viewModel)
viewer.setItemDelegate(ElementThumbDelegate(viewer))
viewer.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
导入系统
从PyQt5导入QtCore、QtGui、QtWidgets
类MyElement(对象):
定义初始化(self,numid):
self.numid=numid
self.strid=“Hello world{}”。格式(numid)
self.param=“a”如果numid%2==0,则为“b”
定义报告(自我):
return“(numid{},strid'{}',param'{}')。格式(
self.numid、self.strid、self.param
)
elements=[MyElement(i)表示范围(20)内的i]
类ElementListModel(QtCore.QAbstractListModel):
定义初始化(self,元素=[],父元素=无):
super(ElementListModel,self)。\uuuu init
self.\uu元素=元素
def行数(self,parent=QtCore.QModelIndex()):
返回len(自身元素)
def数据(自身、索引、角色):
如果没有index.isValid()或没有(0),你的问题很混乱,你能清楚地解释一下你想得到什么吗?谢谢@eyllanesc-我修改了代码和问题,希望现在更清楚;否则让我知道,我会再试一次谢谢,效果很好-对我来说最重要的是需要创建一个自定义图标(我想可能还有一个角色,我可以用来,比如说,边界——但我就是无法从文档中解析它),很高兴现在知道了这一点!