我已经将QTreeView
子类化,并从QAbstractTableModel
创建了模型子类,一切正常。如果QTreeView中的某些内容正在从代码(而不是用户)中更改,那么该行的文本颜色将变为红色。我已通过Qt::TextColorRole
函数检查data()
并返回Qt::red
来实现此槽。
但是如果选择了该特定行,则文本颜色会自动变为黑色(背景颜色变为浅绿色,这是正常的)。取消选择该行后,一切都会好起来的。在调试模式中,我看到data()
函数返回所选行(Qt::red
)的真值。
现在我该如何解决这个问题,可能导致这种不正确的行为?
提前谢谢!
答案 0 :(得分:0)
以下代码是否使文字颜色保持红色?
QPalette p = view->palette();
p.setColor(QPalette::HighlightedText, QColor(Qt::red));
view->setPalette(p);
答案 1 :(得分:0)
我找到了一种通过委托做到这一点的方法。这是代码
class TextColorDelegate: public QItemDelegate
{
public:
explicit TextColorDelegate(QObject* parent = 0) : QItemDelegate(parent)
{ }
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QStyleOptionViewItem ViewOption(option);
QColor itemForegroundColor = index.data(Qt::ForegroundRole).value<QColor>();
if (itemForegroundColor.isValid())
{
if (itemForegroundColor != option.palette.color(QPalette::WindowText))
ViewOption.palette.setColor(QPalette::HighlightedText, itemForegroundColor);
}
QItemDelegate::paint(painter, ViewOption, index);
}
};
使用委托你应该写这样的东西
pTable->setItemDelegate(new TextColorDelegate(this));
其中pTable
的类型为QTableView*
;