Для некоторых столбцов в моем QAbstractItemModel
Мне нужно, чтобы текст отображался специальным цветом. Я делаю это, возвращая этот цвет в data()
где role == Qt::TextColorRole
, Это нормально, пока представление, отображающее эту модель, не будет отключено, тогда эти специальные цвета будут по-прежнему «яркими», а весь остальной текст будет серым или приглушенным.
Есть ли простой способ вернуть специальный цвет, когда виджет отключен?
Идеи, которые потерпели неудачу (или являются слишком сложными):
data()
с правильным цветом для включения / выключения — не работает (и не документировано)QAbstractItemModel::flags()
— базовый класс также не знает о виджете (и не должен)Номер 3 кажется наиболее вероятным, но это немного сложно. Для чего бы это ни стоило, у меня будет только один вид товара с использованием этой модели за раз.
Желаемый код:
QVariant MyModel::data(const QModelIndex& index, int role) const
{
switch (role)
{
case Qt::TextColorRole:
if (isSpecialIndex(index))
{
// Does not work
// Nor does returning a QPalette
return QPair<QColor, QColor>(enabledColor, disabledColor);
}
return QVariant();
}
}
Что мне, вероятно, придется сделать (надеюсь на лучшее решение):
void MyModel::onPartnerWidgetEnableStatusUpdate(bool enabled)
{
beginResetModel();
m_partnerEnabled = enabled;
endResetModel();
}
QVariant MyModel::data(const QModelIndex& index, int role) const
{
switch (role)
{
case Qt::TextColorRole:
if (isSpecialIndex(index))
{
return m_partnerEnabled ? enabledColor : disabledColor;
}
return QVariant();
}
}
// http://doc.qt.io/qt-5/qwidget.html#enabled-prop
void MyWidget::changeEvent(QEvent* event) // override
{
if (event->type() == QEvent::EnabledChange)
{
// or emit a signal hooked to the model
m_model.onPartnerWidgetEnableStatusUpdate(isEnabled());
}
QWidget::changeEvent(event);
}
Естественно, это не будет работать с несколькими представлениями на одной модели.
Задача ещё не решена.