Python 在QListView中将QStyledItemDelegates用作自定义项
我想设计一个自定义的Python 在QListView中将QStyledItemDelegates用作自定义项,python,pyqt5,pyside2,qstyleditemdelegate,Python,Pyqt5,Pyside2,Qstyleditemdelegate,我想设计一个自定义的ListView小部件,它有如下类似的自定义项: 然而,qt文档和一些stackoverflow文章指出,理想情况下应该使用QStyleItemDelegate。我以前从未与“代表”一起工作过,但据我的研究所知,ListView会调用他们来绘制/渲染每个项目 我在另一个项目()中找到了一个委托示例,他们手工绘制所有内容/基本上是通过绘制矩形来重建整个小部件 这对我来说似乎有点不切实际,因为大多数时候自定义项小部件可以是现有小部件的组合。请看上面的屏幕截图。它基本上包含一个Q
ListView
小部件,它有如下类似的自定义项:
然而,qt文档和一些stackoverflow文章指出,理想情况下应该使用QStyleItemDelegate
。我以前从未与“代表”一起工作过,但据我的研究所知,ListView会调用他们来绘制/渲染每个项目
我在另一个项目()中找到了一个委托示例,他们手工绘制所有内容/基本上是通过绘制矩形来重建整个小部件
这对我来说似乎有点不切实际,因为大多数时候自定义项小部件可以是现有小部件的组合。请看上面的屏幕截图。它基本上包含一个Qlabel、QPixmap和四个DoubleSpinbox
问题:您将如何使用已有的绘制/渲染方法,而不是自己手动绘制所有内容?
这样,您就可以从现有的成员方法中获益,并可以使用布局来构建小部件
例如,第一个ListViewItem应将模型数据传递给代理,以便可以将self.lightGroupName
QLabel的文本设置为“Light1”
非常感谢您的帮助,因为我不知道如何从这里开始:
from PySide2 import QtCore, QtGui, QtWidgets
class LightDelagate(QtWidgets.QStyledItemDelegate): #custom item view
def __init__(self, parent=None):
super(LightDelagate, self).__init__(parent)
self.setupUI()
def setupUI(self):
self.masterWidget = QtWidgets.QWidget()
#Light Group Header
self.hlayLightHeader = QtWidgets.QHBoxLayout()
self.lightGroupName = QtWidgets.QLabel("Checker")
self.hlayLightHeader.addWidget(self.lightGroupName)
#Light AOV Preview
self.lightPreview = QtWidgets.QLabel()
#set size
self.aovThumbnail = QtGui.QPixmap(180, 101)
#self.lightPreview.setPixmap(self.aovThumbnail.scaled(self.lightPreview.width(), self.lightPreview.height(), QtCore.Qt.KeepAspectRatio))
# #Color Dials
# self.hlayColorDials = QtWidgets.QHBoxLayout()
# self.rgbDials = QtWidgets.QHBoxLayout()
# self.rDial = QtWidgets.QDoubleSpinBox()
# self.rDial.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
# self.gDial = QtWidgets.QDoubleSpinBox()
# self.gDial.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
# self.bDial = QtWidgets.QDoubleSpinBox()
# self.bDial.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
# self.rgbDials.addWidget(self.rDial)
# self.rgbDials.addWidget(self.gDial)
# self.rgbDials.addWidget(self.bDial)
# #Exposure
# self.hlayExposureDials = QtWidgets.QHBoxLayout()
# self.exposureDial = QtWidgets.QDoubleSpinBox()
# self.exposureDial.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
# self.hlayExposureDials.addWidget(self.exposureDial)
# self.hlayColorDials.addLayout(self.rgbDials)
# self.hlayColorDials.addLayout(self.hlayExposureDials)
#entire layout
self.vlayWidget = QtWidgets.QVBoxLayout()
self.vlayWidget.addLayout(self.hlayLightHeader)
self.vlayWidget.addWidget(self.lightPreview)
# self.vlayWidget.addLayout(self.hlayColorDials)
self.vlayWidget.setContentsMargins(2,2,2,2)
self.vlayWidget.setSpacing(2)
self.masterWidget.setLayout(self.vlayWidget)
def paint(self, painter, option, index):
rowData = index.model().data(index, QtCore.Qt.DisplayRole)
self.lightGroupName.setText(rowData[0])
print (option.rect)
painter.drawRect(option.rect)
painter.drawText()
def sizeHint(self, option, index):
return QtCore.QSize(200, 150)
class LightListModel(QtCore.QAbstractListModel): #data container for list view
def __init__(self, lightList= None):
super(LightListModel, self).__init__()
self.lightList = lightList or []
#reimplement
def rowCount(self, index):
return len(self.lightList)
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
lightGroupData = self.lightList[index.row()]
return lightGroupData
class LightListView(QtWidgets.QListView): #
def __init__(self):
super(LightListView, self).__init__()
self.setFlow(QtWidgets.QListView.LeftToRight)
self.setItemDelegate(LightDelagate(self))
self.setMinimumWidth(1880)
lightListTest = [
('Light1' , {'lightList' : [], 'lightColor': (0,0,0), 'mod_exposure': 1, 'mod_color' : (0,0,0)}),
('Light2' , {'lightList' : [], 'lightColor': (0,0,0), 'mod_exposure': 1, 'mod_color' : (0,0,0)}),
('Light3' , {'lightList' : [], 'lightColor': (0,0,0), 'mod_exposure': 1, 'mod_color' : (0,0,0)}),
('Light4' , {'lightList' : [], 'lightColor': (0,0,0), 'mod_exposure': 1, 'mod_color' : (0,0,0)})
]
app = QtWidgets.QApplication([])
LLV = LightListView()
model = LightListModel(lightList=lightListTest)
LLV.setModel(model)
LLV.show()
LLV.setSe
app.exec_()
您是否可以使用
QListWidget
并覆盖而不是QListView
?这样做的想法是,您可以返回一个QWidget
(根据您的屏幕截图显示子部件),而不必实现调用每个子部件的paint
方法的QListWidget
。是否可以使用QListWidget
并覆盖?这样做的想法是,您可以返回一个QWidget
(根据您的屏幕截图显示子对象),而不必实现调用每个子对象的paint
方法的QStyledItemDelegate
。不,很遗憾,setItemWidget()和QListWidget不是一个选项,因为我必须使用模型/视图结构。不,不幸的是,setItemWidget()和QListWidget不是一个选项,因为我必须使用模型/视图结构。