QTableView中选择行的自定义颜色

4
我正在使用一个继承自QAbstractTableModel()的自定义模型来使用QTableView。该模型基于显示的值更改某些单元格的前景和背景颜色。
我将选择行为设置为选择整行。问题在于,当我选择一行时,整行的背景颜色变为标准橙色,文本颜色变为白色。一旦我取消选择,它就会恢复到模型设置的样式。
我的目标是,当用户选择一行时,其前景和背景颜色不应更改。
我尝试设置QPalette,但无法找到实现上述目标的方法。
我正在使用Qt 5.1.0(32位)和C++。

3
你尝试设置视图调色板中 QPalette::HighlightQPalette::HighlightedText 角色的值了吗?请注意,修改时不要改变原意,但要使翻译内容通俗易懂。 - Pavel Strakhov
是的,我尝试过使用 QPalette::HighlightedText 设置颜色,它生效了,但是使用 QPalette::Highlight 设置的颜色却没有生效。 - javed
2个回答

4
您可以在您的表视图类中执行以下操作:
const QColor hlClr = Qt::red; // highlight color to set
const QColor txtClr = Qt::white; // highlighted text color to set

QPalette p = palette();
p.setColor(QPalette::Highlight, hlClr);
p.setColor(QPalette::HighlightedText, txtClr);
setPalette(p);

1
我确实尝试过这个,但是奇怪的是背景颜色从未改变。尽管如此,高亮行的文本颜色会根据我使用的调色板进行更改。 - javed
对我有用,我正在使用Qt 5.7。 - Rinat

2

QTableView和QTreeView使用QStyledItemDelegate,它会忽略调色板,因为它只会使突出显示的行变暗。至少,在使用交替行颜色时,我已经注意到了这一点,但静态行颜色也适用。

现在,你可以使用QItemDelegate(看起来很糟糕,没有悬停高亮),或者通过使用样式表来重写行为。我更喜欢后者:

setStyleSheet("QTreeView::item:selected{background-color: palette(highlight); color: palette(highlightedText);};");

这将使我在Windows 8.1中选择的项目背景变为蓝色,文本颜色变为黑色。现在您可以轻松地设置调色板中的Highlight和HighlightedText以获取其他颜色。


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