这两个类都为模型中的数据项提供显示和编辑工具.QStyledItemDelegate 是更新和关于QItemDelegate状态的Qt文档:
请注意,QStyledItemDelegate已经接管了绘制Qt项目视图的工作.我们建议在创建新委托时使用QStyledItemDelegate.
我很困惑这两者之间的区别是什么,为什么QStyledItemDelegate首选QItemDelegate!
我在实现自定义窗口小部件渲染时遇到困难QListView.我目前有一个QListView显示我的自定义模型PlayQueue基于QAbstractListModel.
这对于简单的文本工作正常,但现在我想为每个元素显示一个自定义小部件.所以我将a子类化为QStyledItemDelegate实现这样的paint方法:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
QWidget *widget = new QPushButton("bonjour");
widget->render(painter);
}
Run Code Online (Sandbox Code Playgroud)
正确呈现选择背景但不显示小部件.我尝试使用QPainterQt示例中的简单命令,这很好用:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
if (option.state & QStyle::State_Selected)
painter->setPen(option.palette.highlightedText().color());
painter->setFont(QFont("Arial", 10));
painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了一些改变:
QStyledItemDelegate到QItemDelegatepainter->save()和 …我想绘制一个遵循当前样式的自定义项目委托。但是“ WindowsVista / 7”样式和“ WindowsClassic”样式之间的文本颜色有所不同。

我使用以下代码绘制背景(工作):
void FriendItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
painter->save();
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
QSize hint = sizeHint(opt, index);
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
...
}
Run Code Online (Sandbox Code Playgroud)
如何以正确的颜色绘制文本?
我不能style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);用来绘制整个项目,因为我必须绘制比一行文字更多的特殊文字。(此功能可以正确绘制颜色。)
我尝试过,style->drawItemText(painter, opt.rect, opt.displayAlignment, opt.palette, true, "Hello World!");但它总是漆成黑色。对于painter->drawText(),我不知道如何设置正确的笔颜色。
我试图在python中从这个线程翻译代码:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
__data__ = [
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt …Run Code Online (Sandbox Code Playgroud) 问题:
当在 TreeView 上的每行或列设置 QtstyledItemDelegate 时,我的应用程序崩溃,没有任何进一步的信息。尽管如此,为整个 TreeView 设置 QStyledItemDelegate 的工作在我看来似乎很奇怪。
有谁知道这是否是一个已知的错误,或者我错过了什么
我正在将 PySide 1.1.2 与 Qt 4.8 一起使用(更改版本并不是真正的选择,因为这将是一个很大的开销,因为它是一个也在集群上运行的分布式应用程序,其中版本更新将包含大量开销。 .)
这是一个“最小运行示例”
from PySide import QtGui, QtCore
import sys
import easymodel
class MainWin(QtGui.QMainWindow):
def __init__(self, model, parent=None):
super(MainWin, self).__init__(parent)
treeview = QtGui.QTreeView()
treeview.setItemDelegateForColumn(0,QtGui.QStyledItemDelegate())
treeview.setModel(model)
self.setCentralWidget(treeview)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
root = easymodel.TreeItem(easymodel.ListItemData(["Test","Values","Perhabs a button"]))
model = easymodel.TreeModel(root)
for i in range(1,10):
easymodel.TreeItem(easymodel.ListItemData(["Test","Values","Perhabs a button"]),
parent = root,
index=model.index(root.child_count(),1,
parent = root.index()))
mainWin = MainWin(model)
mainWin.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
作为模型,我使用 github 上提供的 …
我设置我的项目委托如下:
COMBOBOX_ITEMS_FRUITS = ['Apple', 'Banana']
COMBOBOX_ITEMS_COLORS = ['Red', 'Green', 'Blue']
self.treeview.setItemDelegateForColumn(COLUMN_A, ComboBoxDelegate(COMBOBOX_ITEMS_FRUITS))
self.treeview.setItemDelegateForColumn(COLUMN_B, ComboBoxDelegate(COMBOBOX_ITEMS_COLORS))
Run Code Online (Sandbox Code Playgroud)
将模型设置为代理模型的源模型后,我的应用程序崩溃但没有抛出任何错误:
self.model_source = treeview_model
self.sf_proxy_model.setSourceModel(self.model_source)
Run Code Online (Sandbox Code Playgroud)
setItemDelegateForColumn当使用sortfilterproxymodel处理源模型时,我似乎只能使用一个.
ComboBoxDelegate 定义如下:
class ComboBoxDelegate(QStyledItemDelegate):
def __init__(self, items):
super(ComboBoxDelegate, self).__init__()
self.items = items
def createEditor(self, parent, option, index):
editor = QComboBox(parent)
editor.setAutoFillBackground(True)
for item in self.items:
editor.addItem(item)
return editor
def setEditorData(self, editor, index):
current_index = editor.findText(index.model().data(index), Qt.MatchExactly)
editor.setCurrentIndex(current_index)
def setModelData(self, editor, model, index):
item_index = model.mapToSource(index)
item = model.sourceModel().item(item_index.row(), 0)
if index.parent().row() == -1 and item.hasChildren():
for row in range(item.rowCount()): …Run Code Online (Sandbox Code Playgroud) 问题:
QTreeView对象,以及QStandardItemModel作为模型来查看小部件;setData方法设置数据以使用参数拆分它们;QStandardItem,这些项目带有图标和一些文本数据;首先,我在想:
Qt Designer为具有2个不同背景图片的对象设置CSS样式表,但是 QStandardItem 没有 setProperty方法...例:
QTreeView#treeView::item[ROLE="AAA"],
QTreeView#treeView::branch[ROLE="AAA"]
{
height: 25px;
border: none;
color: #564f5b;
background-image: url(:/backgrounds/images/row1.png);
background-position: top left;
}
QTreeView#treeView::item[ROLE="BBB"],
QTreeView#treeView::branch[ROLE="BBB"]
{
height: 25px;
border: none;
color: #564f5b;
background-image: url(:/backgrounds/images/row2.png);
background-position: top left;
}
Run Code Online (Sandbox Code Playgroud)
QStyledItemDelegate类,重新实现paint方法,但我不能只改变背景,因为QStyledItemDelegate::paint( painter, opt, index );代码会透支我的drawPixmap...例:
QStyleOptionViewItemV4 opt = option; …Run Code Online (Sandbox Code Playgroud) 我想创建如图所示的相同类型的 QTreeView(不是 QTreeWidget)结构。这是 QT 的属性编辑器。我正在使用 QT-4.6
在第二列,根据不同的条件,我可以有一个旋转框、一个下拉框、一个复选框或一个文本编辑……等等……请指导我如何在不同的单元格中设置不同的代表特定列。从文档中,很明显没有直接的 API 可以在单元格上设置委托(而是可用于完整的小部件或行或列)。
我有一个MyDelegate用于QListWidget. 委托派生自QStyledItemDelegate. 的目标之一MyDelegate是在ListWidget. 它是在以下paint()事件中完成的MyDelegate:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
// ... drawing other delegate elements
QStyleOptionButton checkbox;
// setting up checkbox's size and position
// now draw the checkbox
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkbox, painter);
}
Run Code Online (Sandbox Code Playgroud)
起初我认为复选框会在单击时自动更改其状态,因为我指定了QStyle::CE_CheckBox. 但事实并非如此。看起来我必须手动指定复选框的视觉行为。
数据方面,当用户单击该复选框时,会发出某些信号并更改场景数据。我在editorEvent()以下位置执行此操作:
bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) { …Run Code Online (Sandbox Code Playgroud) 我是Python和PyQt5的新手。我QStyledItemDelegate用来使QTableView仅由ComboBox组成的列之一。我设法显示了ComboBox,但是它的行为遇到了麻烦。
问题1:即使选择已更改,ComboBox似乎也未提交对模型的更改。我使用导出按钮打印出列表以进行检查。
问题2:当我向表中添加新行时,新行的ComboBox选择会一直恢复为第一个选择。这是为什么?
有人可以帮我一些建议吗?谢谢。
码:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import re
class Delegate(QStyledItemDelegate):
def __init__(self, owner, choices):
super().__init__(owner)
self.items = choices
def createEditor(self, parent, option, index):
editor = QComboBox(parent)
editor.addItems(self.items)
return editor
def paint(self, painter, option, index):
if isinstance(self.parent(), QAbstractItemView):
self.parent().openPersistentEditor(index, 1)
QStyledItemDelegate.paint(self, painter, option, index)
def setEditorData(self, editor, index):
editor.blockSignals(True)
value = index.data(Qt.DisplayRole)
num = self.items.index(value)
editor.setCurrentIndex(num)
editor.blockSignals(False)
def setModelData(self, editor, model, index):
value = editor.currentText()
model.setData(index, …Run Code Online (Sandbox Code Playgroud)