如何在QStyledItemDelegate中正确设置文本颜色

6
我希望能绘制一个自定义项委托,与当前样式保持一致。但是在文本颜色方面,“WindowsVista/7”样式和“WindowsClassic”存在差异。
我正在使用以下代码绘制背景(有效):
void FriendItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    painter->save();

    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);
    QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
    QSize hint = sizeHint(opt, index);

    style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
    ...
}

如何以正确的颜色绘制文本?
我不能使用style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);来绘制整个项,因为我必须绘制比一个文本行更特殊的文本。(这个函数可以正确地绘制颜色。)
我尝试使用style->drawItemText(painter, opt.rect, opt.displayAlignment, opt.palette, true, "Hello World!");但它总是绘制黑色。对于painter->drawText(),我不知道如何设置正确的笔颜色。

如果您只需要为文本着色,可以避免使用项代理并使用 QAbstractItemModel::setData()Qt::ForegroundRole - vahancho
我不想使用特定的文本颜色来绘制文本。我想使用当前样式的文本颜色来绘制文本。 - Schlumpf
当前的样式是什么?请展示你的QSS。 - Dmitry Sazonov
我没有QSS。我只想为“Windows Vista/7”主题将所选项目的文本绘制为黑色,而对于“Windows经典”主题,则绘制为白色,就像问题中的图像一样。(当然,它应该适用于所有其他操作系统...) - Schlumpf
2个回答

4

QStyle::drawItemText的文档中写道:

如果指定了显式的textRole,则使用调色板中给定角色的颜色绘制文本。

您可以在委托的 paintEvent 中像这样使用它:

QString myText = ...;

QPalette::ColorRole textRole = QPalette::NoRole;
if (option.state & QStyle::State_Selected)
{
    textRole = QPalette::HighlightedText;
}

qApp->style()->drawItemText(painter, opt.rect, opt.displayAlignment, 
                            opt.palette, true, myText, textRole);

0

对我来说可行:

if (option.state & QStyle::State_Selected && 
    option.state & QStyle::State_Active)
    painter->setPen(option.palette.color(QPalette::HighlightedText));
else 
    painter->setPen(option.palette.color(QPalette::Text));

painter->drawText(textRect, title, textOption);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接