是否可以设置QItemDelegate
一个特定的QTreeWidgetItem
?我需要QTreeWidgetItem
用特定颜色为一些 s 着色。
我认为这是可能的,QAbstractItemView::setItemDelegateForRow
但我不知道如何。我不能使用QAbstractItemView::setItemDelegateForRow
,因为我需要在QTreeWidget
.
有谁知道解决方案?
是否可以设置QItemDelegate
一个特定的QTreeWidgetItem
?我需要QTreeWidgetItem
用特定颜色为一些 s 着色。
我认为这是可能的,QAbstractItemView::setItemDelegateForRow
但我不知道如何。我不能使用QAbstractItemView::setItemDelegateForRow
,因为我需要在QTreeWidget
.
有谁知道解决方案?
您不能QTreeWidgetItem
直接在委托中使用(可能您可以在委托中存储这些项目的列表,但我认为它效率不高),因为委托与QModelIndex
不同角色中的数据一起使用。Qt::UserRole+1
您可以在委托中设置数据并访问它。例如:
QTreeWidgetItem *cities = new QTreeWidgetItem(ui->treeWidget);
//...
cities->setData(0,Qt::UserRole+1,"chosen one");
QTreeWidgetItem *osloItem = new QTreeWidgetItem(cities);
//...
QTreeWidgetItem *berlinItem = new QTreeWidgetItem(cities);
//...
berlinItem->setData(0,Qt::UserRole+1,"chosen one");
内部委托(仅示例):
void ItemDelegatePaint::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QString txt = index.model()->data( index, Qt::DisplayRole ).toString();
if( option.state & QStyle::State_Selected )
{
if(index.data(Qt::UserRole+1).toString() == "chosen one")
painter->fillRect( option.rect,Qt::green );
else
painter->fillRect( option.rect, option.palette.highlight() );
}else
if(option.state & QStyle::State_MouseOver)
{
if(index.data(Qt::UserRole+1).toString() == "chosen one")
painter->fillRect( option.rect,Qt::yellow );
else
painter->fillRect( option.rect, Qt::transparent );
}
else
{
QStyledItemDelegate::paint(painter,option,index);
}
}
您可以访问QTreeWidget
您委托的绘制例程以检查是否满足绘制背景的条件
void custom_delegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
const QTreeWidget* tree_widget = qobject_cast<const QTreeWidget*>(qstyleoption_cast<const QStyleOptionViewItemV3*>(&option)->widget);
....
}
或者您QModelIndex
UserData
按照切尔诺贝利的建议存储一些东西。在这种情况下,我会创建一个enum
for 标志(如果这适用于您的情况):
enum custom_painter_flags{
paint_default = 0,
paint_background = 1
};
void somewhere_creating_the_items()
{
QTreeWidgetItem* newitem = new QTreeWidgetItem(...);
newitem->setData(0, Qt::UserRole, QVariant::fromValue<int>(custom_painter_flags::paint_background));
}
void custom_delegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
custom_painter_flags painter_flags = static_cast<painter>(index.data(Qt::UserRole).value<int>());
if(painter_flags & paint_background){
....
}
}
不幸的是,我现在没有太多时间,所以很快就整理好了。如果您发现任何错误,请随时编辑。
您可以在 QTreeWidgetItem 上使用 qss 来更改颜色或背景颜色。
我已经为 QTableWidget 完成了它,您必须检查所有 QTreeWidgetItem 的值并设置背景颜色/颜色。
例如,对于我的 QTableWidget,我在一个循环中做了这样的事情:
如果(好项目):MyQTableItem.setBackground(QtGui.QColor(255,255,255))