Стиль наведения и выбранные цвета для произвольно выбранных QTreeWidgetItems

У меня есть QTreeWidget и у меня есть таблица стилей, примененная к нему. Я хотел бы некоторые из QTreeWidgetItemчтобы иметь разные hover а также selected цвета, чем остальные элементы стиля. Я покрасил normal состояние с setData(columnNumber, Qt::ForegroundRole, colorName) но я не могу изменить их цвета для парения и выбранных состояний.

Кто-нибудь знает, возможно ли добиться этого в Qt каким-то образом?

Спасибо!

1 ответ

Решение

Таблица стилей AFAIK - не панацея для всего. Вы хотите очень конкретную вещь, поэтому вы должны смотреть глубже и использовать что-то более мощное. Я предлагаю вам использовать делегат. Вы не предоставили спецификации, поэтому я предлагаю основную идею. В QStyledItemDelegate переопределение подкласса paint, Например:

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 )//it is your selection
    {
        if(index.row()%2)//here we try to see is it a specific item
            painter->fillRect( option.rect,Qt::green );//special color
        else
            painter->fillRect( option.rect, option.palette.highlight() );
        painter->drawText(option.rect,txt);//text of item
    } else
    if(option.state & QStyle::State_MouseOver)//it is your hover
    {
        if(index.row()%2)
            painter->fillRect( option.rect,Qt::yellow );
        else
            painter->fillRect( option.rect, Qt::transparent );
        painter->drawText(option.rect,txt);
    }
    else
    {
        QStyledItemDelegate::paint(painter,option,index);//standard process
    }

}

Здесь я устанавливаю некоторые специфические свойства для каждого второго элемента, но вы можете использовать другие конкретные элементы.

QTreeWidget Inherits QTreeView так что используйте:

ui->treeWidget->setItemDelegate(new ItemDelegatePaint);

Кажется, что ваш виджет сложен, поэтому я надеюсь, что вы понимаете основную идею и сможете написать делегат, который будет абсолютно подходящим для вас. Если вы раньше не работали с делегатами, то посмотрите примеры, это не очень сложно.

http://qt-project.org/doc/qt-4.8/itemviews-stardelegate-stardelegate-h.html

http://qt-project.org/doc/qt-4.8/itemviews-stardelegate-stardelegate-cpp.html

В своем ответе я использовал следующий делегат:

#ifndef ITEMDELEGATEPAINT_H
#define ITEMDELEGATEPAINT_H

#include <QStyledItemDelegate>
class ItemDelegatePaint : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit ItemDelegatePaint(QObject *parent = 0);
    ItemDelegatePaint(const QString &txt, QObject *parent = 0);


protected:
    void paint( QPainter *painter,
                const QStyleOptionViewItem &option,
                const QModelIndex &index ) const;
    QSize sizeHint( const QStyleOptionViewItem &option,
                    const QModelIndex &index ) const;
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget * editor, const QModelIndex & index) const;
    void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;
    void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const;

signals:

public slots:

};

#endif // ITEMDELEGATEPAINT_H

Здесь есть много методов, но paint самое важное для вас.

Другие вопросы по тегам