我有一个QTreeWidget
我已经应用了样式表。我希望某些QTreeWidgetItem
具有与其他styesheet样式项不同的hover
和selected
颜色。我使用normal
为setData(columnNumber, Qt::ForegroundRole, colorName)
状态着色,但我无法更改悬停和选定状态的颜色。
有人知道是否有可能以某种方式在Qt
中实现这一目标?
谢谢!
答案 0 :(得分:4)
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
继承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
对你来说最重要。