Я подклассифицировал QTreeView
и сделал модель подклассом из QAbstractTableModel
и все работает отлично. Если что-то меняется в QTreeView из кода (а не пользователем), тогда цвет текста строки становится красным. Я реализовал этот корыто, проверяя Qt::TextColorRole
от функции data()
и возвращаю Qt::red
.
Но если выбран этот конкретный ряд, цвет текста автоматически изменяется на черный (а цвет фона - светло-зеленый, что является нормальным). После отмены выбора этой строки все будет хорошо. В режиме отладки я видел, что функция data()
возвращает истинное значение для выбранной строки (Qt::red
).
Теперь, как я могу решить эту проблему, что может привести к неправильному поведению?
Заранее спасибо!
Я нашел способ сделать это через делегата. Вот код
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*
;
Сохраняет ли ваш код красный цвет в следующем коде?
QPalette p = view->palette();
p.setColor(QPalette::HighlightedText, QColor(Qt::red));
view->setPalette(p);