gpt4 book ai didi

c++ - QTreeView Item Hover/根据当前颜色选择背景色

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:01 26 4
gpt4 key购买 nike

在我的项目中,我有几个显示数据的QTreeView 小部件。 QTreeView 中项目的背景颜色根据数据类型和与其他项目的关联而变化。

下面是这些背景颜色的设置方式:

QColor warning;
warning.setRgb(255, 86, 86);
model->itemFromIndex(index)->setData(warning, Qt::BackgroundRole);

这行得通,但是我还想在选择/悬停某个项目时使用不同的背景颜色。我选择使用样式表。

QTreeView::item:selected{background-color: #bedcf0;} //light blue
QTreeView::item:hover:selected{background-color: #94c8ea;} //darker blue
QTreeView::item:hover:!selected{background-color: #e6e6e6;} //gray

这提供了我想要的外观,但仅适用于具有白色默认背景的项目。如果项目具有自定义背景颜色(通过 Qt::BackgroundRole 设置),则这些悬停和选定颜色会完全覆盖当前背景颜色。

我想要发生的事情是让每个项目在悬停/选择时变暗一个设定的量,基于当前的背景颜色。这很难,因为 QStandardItem::setProperty() 不存在。

感谢您的宝贵时间!

最佳答案

所以我能够自己解决这个问题。 (毫无意义的赏金,我不知道为什么我在检查它是否有效之前交出了 50 个代表。)

我所做的是继承 QStyledItemDelegate 并重新实现 paint() 函数。

.h

class MyStyledItemDelegate : public QStyledItemDelegate
{
Q_OBJECT

public:
explicit MyStyledItemDelegate(QObject *parent = 0){}

virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
}

在这个绘制函数中,我能够检查索引的 UserRoles 是否有自定义标志来决定我想要的颜色。我可以使用 QStyle::State_SelectedQStyle::State_MouseOver 检查索引是否被选中或悬停。使用这些信息,我能够编写逻辑来确定我想要的颜色。之后,我不得不手动绘制背景、图标和文本。

.cpp

void MyStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//background
QColor bgColor;
int bgColorType(0);
bgColorType = index.data(Qt::UserRole+9).toInt();//custom flag I set to determine which color i want

//color logic
if(bgColorType == 0)
bgColor = QColor(Qt::transparent);//default is transparent to retain alternate row colors
else if(bgColorType == 1)
bgColor = qRgba(237, 106, 106, 255);//red
else if(bgColorType == 2)
bgColor = qRgba(241, 167, 226, 255);//pink
//etc...

QStyleOptionViewItem opt(option);

if(option.state & QStyle::State_Selected)//check if item is selected
{
//more color logic
if(bgColorType == 0)
bgColor = qRgba(190, 220, 240, 255);
else
bgColor = qRgba(bgColor.red()-25, bgColor.green()-25, bgColor.blue()-25, 255);

//background color won't show on selected items unless you do this
opt.palette.setBrush(QPalette::Highlight, QBrush(bgColor));
}

if(option.state & QStyle::State_MouseOver)//check if item is hovered
{
//more color logic
bgColor = qRgba(bgColor.red()-25, bgColor.green()-25, bgColor.blue()-25, 255);

if(option.state & QStyle::State_Selected)//check if it is hovered AND selected
{
//more color logic
if(bgColorType == 0)
{
bgColor = qRgba(148, 200, 234, 255);
}

//background color won't show on selected items unless you do this
opt.palette.setBrush(QPalette::Highlight, QBrush(bgColor));
}
}


//set the backgroundBrush to our color. This affects unselected items.
opt.backgroundBrush = QBrush(bgColor);

//draw the item background
option.widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter);

//icon
QRect iconRect = option.rect;
iconRect.setLeft(iconRect.left()+3);//offset it a bit to the right
//draw in icon, this can be grabbed from Qt::DecorationRole
//altho it appears icons must be set with setIcon()
option.widget->style()->drawItemPixmap(painter, iconRect, Qt::AlignLeft | Qt::AlignVCenter, QIcon(index.data(Qt::DecorationRole).value<QIcon>()).pixmap(16, 16));

//text
QRect textRect = option.rect;
textRect.setLeft(textRect.left()+25);//offset it a bit to the right
//draw in text, this can be grabbed from Qt::DisplayRole
option.widget->style()->drawItemText(painter, textRect, Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, index.data(Qt::DisplayRole).toString());
}

完成后,我只需使用 myTreeView->setItemDelegate(new MyStyledItemDelegate(myTreeView));

将委托(delegate)应用于我的 QTreeView

无需样式表、后台角色更改或事件过滤器。

关于c++ - QTreeView Item Hover/根据当前颜色选择背景色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43035378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com