Как вернуть специальный цвет текста из QAbstractItemModel в зависимости от того, включен ли его виджет

Для некоторых столбцов в моем QAbstractItemModelМне нужно, чтобы текст отображался специальным цветом. Я делаю это, возвращая этот цвет в data() где role == Qt::TextColorRole, Это нормально, пока представление, отображающее эту модель, не будет отключено, тогда эти специальные цвета будут по-прежнему «яркими», а весь остальной текст будет серым или приглушенным.

Есть ли простой способ вернуть специальный цвет, когда виджет отключен?

Идеи, которые потерпели неудачу (или являются слишком сложными):

  1. Вернуть форму QPalette data() с правильным цветом для включения / выключения — не работает (и не документировано)
  2. Проверьте QAbstractItemModel::flags() — базовый класс также не знает о виджете (и не должен)
  3. Подключите сигнал от моего виджета к моей модели, чтобы излучать всякий раз, когда изменяется / отключается состояние виджета.

Номер 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);
}

Естественно, это не будет работать с несколькими представлениями на одной модели.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]