我正在尝试在PyQt中使用Model-View。我有一个QStandardItemModel和QListView。我想在我的模型中添加一个QStandardItem。我只能添加文字和图标。但是,如果我想添加,例如两个或三个图标,该怎么办?是否可以在我的项目中添加布局和一些小部件?
这是我的代码:
class SponsorsHorizontal(QtWidgets.QWidget, Ui_SponsorsHorizontal):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setupUi(self)
self.partners_model = QtGui.QStandardItemModel()
self.partners_list_view.setModel(self.partners_model)
icon = QtGui.QIcon(QtGui.QPixmap(path_convert('resources/logos/' + object[i]['logo'])))
item = QtGui.QStandardItem(icon, object[i]["name"] + " ")
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.partners_model.appendRow(item)
我知道我们可以在QListWIdget和QListWidgetItem中添加具有布局和随机项目数的小部件。我可以在Qt中的Model中做类似的事情吗?
答案 0 :(得分:2)
我玩QStyledItemDelegate
只是为了好玩和学习,如何通过委托将文本和其他元素放在项目中。
您可以为每个项目的模型(UserRole)添加图标列表。子类QStyledItemDelegate
并覆盖paint()
以按照此代理的方式绘制图标
这是一个随机设置图标的工作示例:
import sys, random
from PyQt5 import QtGui, QtCore, QtWidgets
class ViewDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self):
QtWidgets.QStyledItemDelegate.__init__(self)
self.padding = 2
self.AlignmentFlag = QtCore.Qt.AlignRight
def paint(self, painter, option, index):
x = option.rect.x()
y = option.rect.y()
width = option.rect.width()
height = option.rect.height()
iconList = index.data(256) # get the icons associated with the item
text = index.data() # get the items text
for a, i in enumerate(iconList):
m = max([i.width(), i.height()])
f = (height- 2*self.padding)/m # scalingfactor
i = i.scaled(int(i.width()*f),int(i.height()*f)) # scale all pixmaps to the same size depending on lineheight
painter.drawPixmap(QtCore.QPoint(x,y+self.padding),i)
x += height
painter.drawText(QtCore.QRect(x + self.padding,y + self.padding, width - x - 2*self.padding, height - 2*self.padding),self.AlignmentFlag, text)
class MyWidget(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.setGeometry(200,100,200,220)
self.icons = []
for i in ('arrow_double.svg', 'asc.png', 'desc.png', 'checked.png'):
icon = QtGui.QPixmap(i)
self.icons.append(icon)
self.listWidget = QtWidgets.QListView(self)
self.delegate = ViewDelegate()
self.listWidget.setGeometry(20,20,160,180)
self.listWidget.setItemDelegate(self.delegate)
self.model = QtGui.QStandardItemModel(self.listWidget)
itemsTexts = ['abcde','fghij','klmno','pqrst','uvwxy','zABCD']
for r, i in enumerate(itemsTexts):
item = QtGui.QStandardItem(i)
self.model.setItem(r,0, item)
self.model.setData(self.model.index(r,0), self.iconList(), 256) # save the items icons in userRole
self.listWidget.setModel(self.model)
def iconList(self): # creates a random iconList
r = random.randint(1,len(self.icons)) # Anzahl icons in the list
iconList = []
for i in range(0,r):
n = random.randint(0,len(self.icons)-1)
icon = self.icons[n]
iconList.append(icon)
return iconList
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())