Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows QListWidget如何设置黑色或白色选定文本?_Windows_Qt_Colors_Highlight_Qlistwidget - Fatal编程技术网

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

Windows QListWidget如何设置黑色或白色选定文本?,windows,qt,colors,highlight,qlistwidget,Windows,Qt,Colors,Highlight,Qlistwidget,标准QListWidget在Windows XP上绘制选定行的白色文本,在Windows 7/8上绘制选定行的黑色文本。它在哪里变成黑色或白色 我为ListView创建了一个自定义委托,并尝试在选定的行中绘制文本,但应用程序调色板返回相同的颜色HighlightedText、BrightText、WindowText、WinXP和8上的文本,而默认委托以某种方式将其绘制为黑色或白色。我查看了Qt源代码,找不到它在哪里得到对比色。QListWidget样式本身在所有平台上也返回相同颜色的Foreg

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

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

我是否缺少在Qt应用程序中获得正确操作系统调色板的方法?

对于QListWidget,它有点复杂。 从最低优先级设置开始:

每个QWidget都有一个包含不同状态和项目的颜色集,这取决于它是否工作的风格和平台——通常是这样。 可以覆盖调色板,您可以使用文本格式的CSS设置这些颜色。 数据模型可以提供颜色使用接受。
如果您提供一名代表,则您负责处理颜色,如果我找到一些颜色图案,我将给您一个链接。

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

所有相关代码应位于qtbase/src/widgets/styles/qwindowsxpstyle.cpp和qtbase/src/widgets/styles/qwindowsvistastyle.cpp中,搜索pGetThemeColor”

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

谢谢

无论如何,事实证明QListWidget/View委托实际上并没有绘制文本——它要求style绘制本机控件,并在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);
    //...
}

谢谢,这正是正确的答案。。。这对我设置正确的颜色没有帮助。我了解默认代理的作用,并且使用样式的本机绘图解决了我的文本颜色问题。看起来代理并不是真正负责处理颜色-主题引擎发挥了最大的魔力,所以使用样式->绘图控件是最佳的。手动设置颜色可能只在具有单个主题的单个操作系统上看起来不错。