Выбор QTreeView очищает цвет текста

0

Я подклассифицировал QTreeView и сделал модель подклассом из QAbstractTableModel и все работает отлично. Если что-то меняется в QTreeView из кода (а не пользователем), тогда цвет текста строки становится красным. Я реализовал этот корыто, проверяя Qt::TextColorRole от функции data() и возвращаю Qt::red.

Но если выбран этот конкретный ряд, цвет текста автоматически изменяется на черный (а цвет фона - светло-зеленый, что является нормальным). После отмены выбора этой строки все будет хорошо. В режиме отладки я видел, что функция data() возвращает истинное значение для выбранной строки (Qt::red).

Теперь, как я могу решить эту проблему, что может привести к неправильному поведению?

Заранее спасибо!

Теги:
qt
selection
qtreeview

2 ответа

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

0

Сохраняет ли ваш код красный цвет в следующем коде?

QPalette p = view->palette();
p.setColor(QPalette::HighlightedText, QColor(Qt::red));
view->setPalette(p);
  • 0
    На самом деле это меняет выделенный цвет текста как каждый раз, но мне нужно изменить цвет текста конкретной строки, когда он изменяется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню