gpt4 book ai didi

python - QListView 与 CustomWIdget 使用 QStyledItemDelegate

转载 作者:行者123 更新时间:2023-12-05 08:09:31 29 4
gpt4 key购买 nike

我正在尝试使用 QStyledItemDelegate 创建一个 QListView 以更有条理地显示数据。

我经历了this site ,它全部在 C++ 中,我对此一无所知,从帖子中使用的语法和调用猜测,我尝试了我的方法来实现它,但我没有运气。有人可以帮我解决这个问题吗?

import sys, os

from PyQt4 import QtGui, QtCore


class ListView(QtGui.QListView):
def __init__(self, parent=None):
super(ListView, self).__init__(parent)

self._model = None
self._data = [
[
'Header: King Arthur',
'Project: TBN',
'Asset: arthur',
'Task name: Design doc',
'Start Date: Today',
'End Date: Next Monday'
]
]
self.set_model()
item_delegate = ItemDelegate()
self.setItemDelegate(item_delegate)
self.openPersistentEditor(self._model.createIndex(0, 0))

def set_model(self):
self._model = ListModel(self._data, parent=self)
self.setModel(self._model)


class ListModel(QtCore.QAbstractItemModel):
def __init__(self, data=[], parent=None):
super(ListModel, self).__init__(parent)
self._data = data

def rowCount(self, *arg):
return 1

def columnCount(self, *arg):
return len(self._data)

def data(self, index, role):
row = index.row()
column = index.column()

if role == QtCore.Qt.DisplayRole:
return QtCore.QVariant(' | '.join(self._data[column]))

return QtCore.QVariant()

def index(self, row, column, parent):
return self.createIndex(row, column)

def parent(self, index):
item = index.internalPointer()
if item:
return item.getParent()
else:
item = self.createIndex(index.row(), index.column()).internalPointer()
if item:
return item.getParent()

return QtCore.QModelIndex()

class ItemDelegate(QtGui.QStyledItemDelegate):
def createEditor(self, parent, option, index):
item_data = str(index.data().toString())
editor = Widget(item_data.split('|'), parent=parent)
return editor

def updateEditorGeometry(self, editor, option, index):
editor.setGeometry(option.rect)

class Widget(QtGui.QWidget):
def __init__(self, widget_data=[], parent=None):
super(Widget, self).__init__(parent)

vbox = QtGui.QVBoxLayout(self)
key_font = QtGui.QFont()
key_font.setWeight(QtGui.QFont.Bold)
val_font = QtGui.QFont()
val_font.setWeight(QtGui.QFont.Normal)

for each_data in widget_data:
hbox = QtGui.QHBoxLayout()
key, value = each_data.split(':')
key_text = QtGui.QLabel(self)
val_text = QtGui.QLabel(self)

key_text.setToolTip('Key: %s' % key)
val_text.setToolTip('Value: %s' % value)

key_text.setText(key)
val_text.setText(value)

key_text.setFont(key_font)
val_text.setFont(val_font)

hbox.addWidget(key_text)
hbox.addWidget(val_text)
# vbox.addLayout(hbox)


if __name__ == '__main__':
qapp = QtGui.QApplication([])
app = ListView()
app.show()
sys.exit(qapp.exec_())

最佳答案

除非您有令人信服的理由使用 View/Model 模式,否则在大多数情况下使用 Widget/Item 模式会更容易 -- QListWidgetQListWidgetItem.

QItemDelegateQStyledItemDelegate 被设计为子类化。然后定义负责处理事件、调整大小和绘制 View /小部件的方法。

class MyWidget(QtGui.QWidget):

def __init__(self, parent):
super(MyWidget, self).__init__(parent)
self.listwidget = QtGui.QListWidget(self)
self.delegate = MyDelegate(self, self.listwidget)
self.listwidget.setItemDelegate(self.delegate)

datas = [
{'Header': 'Blah', 'Project': 'TBN'},
{'Header': 'Other', 'Project': 'Something'},
]
for data in datas:
MyItem(self.listwidget, data)


class MyItem(QtGui.QListWidgetItem):

def __init__(self, parent, data):
super(MyItem, self).__init__(parent)
self._data = data


class MyDelegate(QtGui.QStyledItemDelegate):

def __init__(self, parent, listwidget):
super(MyDelegate, self).__init__(parent)
self.listwidget = listwidget

def sizeHint(self, option, index):
if index:
item = self.listwidget.itemFromIndex(index)
print item._data
# Do fontmetrics stuff from C++ article you linked
# using the text in the data dictionary.

def paint(self, painter, option, index):
# same thing, get the item using the index
# get the data from the item
# paint the data however you want.

关于python - QListView 与 CustomWIdget 使用 QStyledItemDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116146/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com