Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在「;图标";默认QListView中具有QAbstractListModel的项的空间?_Python_Pyqt5 - Fatal编程技术网

Python 在「;图标";默认QListView中具有QAbstractListModel的项的空间?

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

考虑此示例,修改自:

导入系统 从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的
data
方法中的
DecorationRole
对其进行“着色”(显然,如果您返回的是QIcon而不是QColor,您也可以在该框中存储图标,但我从未尝试过)

我的问题是:

  • 根据某些属性,如何在图标空间/框周围绘制边框?在上面的例子中,如果列表中给定元素的
    MyElement.param=='a'
    ,那么我希望在“图标空间/框”周围绘制一个2像素宽的浅蓝色(RGB:(38,76,100)或#62c2ff)边框,就像我在圆形区域的模型图像中手动绘制的一样;否则我就不想要边界了
  • 根据某些属性,如何在该空格/方框的中心额外绘制一个字母?例如,如果列表中某个元素的<代码> 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-我修改了代码和问题,希望现在更清楚;否则让我知道,我会再试一次谢谢,效果很好-对我来说最重要的是需要创建一个自定义图标(我想可能还有一个角色,我可以用来,比如说,边界——但我就是无法从文档中解析它),很高兴现在知道了这一点!