【问题标题】:How to paint correct text color in QStyledItemDelegate如何在 QStyledItemDelegate 中绘制正确的文本颜色
【发布时间】:2014-09-29 03:25:15
【问题描述】:

我想绘制一个自定义项委托,它遵循当前样式。但是“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(),我不知道如何设置正确的笔颜色。

【问题讨论】:

  • 如果只需要给文本上色,可以避免使用item delegates,使用QAbstractItemModel::setData()Qt::ForegroundRole
  • 我不想用特定的文本颜色绘制文本。我想用当前样式的文字颜色来绘制文字。
  • 目前的风格是什么?出示您的 QSS。
  • 我没有 QSS。我只想将“Windows Vista/7”主题的选定项目的文本绘制为黑色,将“Windows 经典”主题的文本绘制为白色,就像问题中的图像一样。 (当然,它应该适用于所有其他操作系统...)

标签: qt qt5 qstyle qstyleditemdelegate


【解决方案1】:

docQStyle::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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多