Вы не можете используйте 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);
}
}
Вы можете установить делегат для всего виджета. Затем проверьте элемент в делегате, если он подходит для раскраски или нет. – Bowdzone
@Bowdzone Можно ли получить доступ к 'QTreeWidgetItem' изнутри делегата? –
Вы помните мой последний ответ, так что вы можете использовать что-то 'if (index.parent(). IsValid())' или 'if (index.parent(). Row() == 1)' вместо 'if (index .row()% 2) 'или проверить уникальное значение элемента? – Chernobyl