如何解决使用自定义模型和委托的自定义 ComboBox
我有一个形式为(string、integer、bool)的项目列表,如下所示:
[ ('Item 1',12,True),('Item 2',156,('Item 3',19,False) ]
这是我到目前为止:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyModel(QAbstractListModel):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.data = [
('Item 1',False)
]
def data(self,index,role=None):
if role == Qt.displayRole:
text = self.data[index.row()][0]
return text
if role == Qt.decorationRole:
status = self.data[index.row()][2]
if status:
return QColor('#22FF35')
def rowCount(self,parent=None,**kwargs):
return len(self.data)
class MyDelegate(qstyledItemDelegate):
def __init__(self,**kwargs)
def paint(self,painter,option,index):
painter.save()
options = qstyleOptionViewItem(option)
self.initStyleOption(options,index)
style = options.widget.style()
style.drawItemText(painter,options.widget.rect(),Qt.AlignLeft,options.widget.palette(),True,options.text,QPalette.Text)
painter.restore()
class MyComboBox(QComboBox):
def __init__(self,**kwargs)
self.setFixedSize(200,75)
self.model = MyModel()
self.setModel(self.model)
self.setItemDelegate(MyDelegate())
if __name__ == '__main__':
app = QApplication([])
window = MyComboBox()
window.show()
app.exec()
代码显然不完整,没有实现我的想法。
出现了一些问题,例如:
如何将第一项和第二项都传递给委托?
如果模型返回列表或元组,则委托中的 options.text
将为空。
解决方法
在这种情况下,只需在默认文本上绘制右侧的文本:
TEXT_ROLE,VALUE_ROLE,STATUS_ROLE = ((Qt.UserRole + i + 1) for i in range(3))
class MyModel(QAbstractListModel):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.data = [
("Item 1",12,True),("Item 2",156,("Item 3",19,False),("Item 4",126,("Item 5",100,]
def data(self,index,role=None):
if 0 <= index.row() < self.rowCount():
item = self.data[index.row()]
if role in (TEXT_ROLE,Qt.DisplayRole):
return item[0]
elif role == VALUE_ROLE:
return item[1]
elif role == STATUS_ROLE:
return item[2]
def rowCount(self,parent=QModelIndex()):
if parent.isValid():
return 0
return len(self.data)
class MyDelegate(QStyledItemDelegate):
RIGHT_MARGIN = 4
def initStyleOption(self,option,index):
super().initStyleOption(option,index)
status = index.data(STATUS_ROLE)
option.features |= QStyleOptionViewItem.HasDecoration
pixmap = QPixmap(option.decorationSize)
pixmap.fill(QColor("#22FF35" if status else "transparent"))
option.icon = QIcon(pixmap)
def paint(self,painter,index):
value = index.data(VALUE_ROLE)
super().paint(painter,index)
painter.drawText(
option.rect.adjusted(0,-self.RIGHT_MARGIN,0),Qt.AlignRight | Qt.AlignVCenter,str(value),)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。