对于 myQAbstractItemModel
中的某些列,我需要文本以特殊颜色显示。我通过在data()
where 中返回该颜色来做到这一点role == Qt::TextColorRole
。这很好,直到显示此模型的视图被禁用,然后那些特殊颜色仍然“明亮”,而所有其他文本都是灰色/静音。
是否有一种简单的方法可以在禁用小部件时返回特殊颜色?
失败(或过于复杂)的想法:
- 返回具有正确颜色的 QPalette 表单
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);
}
自然,这不适用于单个模型上的多个视图。