标准QListWidget在Windows XP上绘制所选行的白色文本,在Windows 7/8上绘制黑色。它在哪里变成黑色或白色?
我已经为ListView创建了一个自定义委托并尝试在选定的行中绘制文本,但是应用程序调色板在WinXP和8上返回相同的颜色(HighlightedText,BrightText,WindowText,Text),而默认委托以某种方式绘制它黑或白。我已经查看了Qt源代码,无法找到它在哪里获得对比色。 QListWidget样式本身也在所有平台上返回相同颜色的ForegroundRole。
我是否错过了在Qt app中获得正确的os调色板的方法?
答案 0 :(得分:0)
如果是QListWidget
,则有点复杂。
从最低优先级设置开始:
QWidget
都有palette property,其中包含不同状态和小部件中的项目的颜色集(取决于它是否有效的样式和平台 - 通常是这样)。如果你提供代表,那么你有责任处理颜色,如果我找到一些模式,我会给你一个链接。
答案 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);
//...
}