在特定的QTreeWidgetItem上设置QItemDelegate

时间:2014-12-03 14:10:50

标签: qt qtreewidget qtreewidgetitem qitemdelegate

是否可以在特定QItemDelegate上设置QTreeWidgetItem?我需要为某些特定颜色的QTreeWidgetItem着色。

我认为这是可能的,因为我们有QAbstractItemView::setItemDelegateForRow,但我无法弄清楚如何。我无法使用QAbstractItemView::setItemDelegateForRow,因为我需要在QTreeWidget内的子行上设置自定义委托。

有人知道解决方案吗?

4 个答案:

答案 0 :(得分:2)

你不能直接在委托中使用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);
    }
}

答案 1 :(得分:0)

您可以在QTreeWidgetItem上使用qss来更改颜色或背景颜色。

答案 2 :(得分:0)

我已经为QTableWidget做了,你必须检查所有QTreeWidgetItem的值并设置背景颜色/颜色。

例如,对于我的QTableWidget,我在循环中做了类似的事情:

if(good item): MyQTableItem.setBackground(QtGui.QColor(255,255,255))

答案 3 :(得分:0)

您可以从委托的绘画例程访问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(如果这适用于您的情况):

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){
        ....
    }
}

不幸的是,我现在没有多少时间,所以这很快就被抛到了一起。如果您发现任何错误,请随时编辑。