对于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);
}
当然,这不适用于单个模型的多个视图。