QTreeView选择清除文本颜色

时间:2013-10-14 14:22:48

标签: c++ qt selection qtreeview

我已经将QTreeView子类化,并从QAbstractTableModel创建了模型子类,一切正常。如果QTreeView中的某些内容正在从代码(而不是用户)中更改,那么该行的文本颜色将变为红色。我已通过Qt::TextColorRole函数检查data()并返回Qt::red来实现此槽。

但是如果选择了该特定行,则文本颜色会自动变为黑色(背景颜色变为浅绿色,这是正常的)。取消选择该行后,一切都会好起来的。在调试模式中,我看到data()函数返回所选行(Qt::red)的真值。

现在我该如何解决这个问题,可能导致这种不正确的行为?

提前谢谢!

2 个答案:

答案 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*;