QListWidget如何设置黑色或白色选定文本?

时间:2014-03-12 07:26:52

标签: windows qt colors highlight qlistwidget

标准QListWidget在Windows XP上绘制所选行的白色文本,在Windows 7/8上绘制黑色。它在哪里变成黑色或白色?

我已经为ListView创建了一个自定义委托并尝试在选定的行中绘制文本,但是应用程序调色板在WinXP和8上返回相同的颜色(HighlightedText,BrightText,WindowText,Text),而默认委托以某种方式绘制它黑或白。我已经查看了Qt源代码,无法找到它在哪里获得对比色。 QListWidget样式本身也在所有平台上返回相同颜色的ForegroundRole。

我是否错过了在Qt app中获得正确的os调色板的方法?

3 个答案:

答案 0 :(得分:0)

如果是QListWidget,则有点复杂。 从最低优先级设置开始:

  1. 每个QWidget都有palette property,其中包含不同状态和小部件中的项目的颜色集(取决于它是否有效的样式和平台 - 通常是这样)。
  2. Style sheet可以覆盖调色板,您可以使用CSS以文本格式设置这些颜色。
  3. 数据模型可以使用接受性role value来提供颜色。
  4. 如果你提供代表,那么你有责任处理颜色,如果我找到一些模式,我会给你一个链接。

答案 1 :(得分:0)

不幸的是,并非所有颜色都可通过QPalette读取。特别是对于QAbstractItemView子类(列表视图,树视图......),Windows样式通过WinAPI检索颜色并直接使用它们进行绘制。

所有相关代码应该在qtbase / src / widgets / styles / qwindowsxpstyle.cpp和qtbase / src / widgets / styles / qwindowsvistastyle.cpp中,搜索" pGetThemeColor“。

正如Marek所说,对于其中一些颜色,可以覆盖这些默认值,但不可能通过Qt API读取它们。

答案 2 :(得分:0)

感谢。

无论如何,事实证明QListWidget / View委托实际上不绘制文本 - 它要求样式绘制本机控件,并在Qt主题引擎深处绘制对比文本。如果笔和画笔与默认调色板中的相同,则其颜色可能会更改为以os为主题。 本机绘图为我解决了文本颜色问题。

void customDelegate::paint(QPainter *painter,
    const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // ...
    QStyleOptionViewItemV4 opt = option;
    opt.state            = opt.state & (~QStyle::State_HasFocus); // no dots
    opt.displayAlignment = Qt::AlignVCenter | Qt::AlignLeft; // or right
    opt.features         = QStyleOptionViewItemV2::HasDisplay;
    opt.text             = displayText(textGoesThere, opt.locale); // <--
    opt.rect             = option.rect;
    //...

    if (multipartDrawing) {
        if (drawingSomethingAtLeft)
            opt.viewItemPosition = QStyleOptionViewItem::Beginning;
        else if (somethingAtRight)
            opt.viewItemPosition = QStyleOptionViewItem::End;
        else
            opt.viewItemPosition = QStyleOptionViewItem::Middle;
    }
    else    opt.viewItemPosition = QStyleOptionViewItem::OnlyOne;

    owner->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter);
    //...
}