首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在特定的QItemDelegate上设置QTreeWidgetItem

在特定的QItemDelegate上设置QTreeWidgetItem
EN

Stack Overflow用户
提问于 2014-12-03 14:10:50
回答 4查看 2.1K关注 0票数 1

是否可以在特定的QItemDelegate上设置QTreeWidgetItem?我需要用特定的颜色对一些QTreeWidgetItem进行着色。

我认为这是可能的,因为我们有QAbstractItemView::setItemDelegateForRow,但我不知道怎么做。我不能使用QAbstractItemView::setItemDelegateForRow,因为我需要在QTreeWidget中的子行上设置一个自定义委托。

有人知道解决这个问题的办法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-03 16:14:51

可以从委托的画图例程访问QTreeWidget,以检查是否满足绘制背景的条件

代码语言:javascript
复制
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 (如果这适用于您的情况):

代码语言:javascript
复制
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){
        ....
    }
}

不幸的是,我现在没有太多的时间,所以这是一个非常快的组合。如果您发现任何错误,请随时编辑。

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 14:29:43

您不能在委托中直接使用QTreeWidgetItem (可能可以在委托中存储此项的列表,但我认为它并不有效),因为委托使用不同角色中的QModelIndex和数据。您可以将数据设置为Qt::UserRole+1并在委托中访问它。例如:

代码语言:javascript
复制
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");

内部委托(仅举例子):

代码语言:javascript
复制
    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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-12-03 14:15:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27273839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档