2014-11-26 12 views
1

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

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

Спасибо!

ответ

3

Таблица стилей AFAIK не является панацеей от всего. Вам нужна очень конкретная вещь, поэтому вы должны смотреть глубже и использовать что-то более мощное. Я предлагаю вам использовать делегат. Вы не указали спецификацию, поэтому я предоставляю основную идею. В QStyledItemDelegate подкласс reimplement 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 является наиболее важным для вас.

+0

Спасибо, это помогло! –