の一部の列ではQAbstractItemModel
、テキストを特別な色で表示する必要があります。data()
その色をwhere に返すことでこれを行っていrole == Qt::TextColorRole
ます。このモデルを表示するビューが無効になるまでは問題ありませんが、他のすべてのテキストがグレー/ミュートされている間、これらの特別な色はまだ「明るい」ままです。
ウィジェットが無効になっているときに特別な色を返す簡単な方法はありますか?
失敗した (または複雑すぎる) アイデア:
- 有効/無効に適した色の QPalette フォームを返し
data()
ます - 機能しません (文書化されていません) - チェック
QAbstractItemModel::flags()
- 基本クラスはウィジェットについても認識していません (また、そうすべきではありません) - ウィジェットからモデルにシグナルを接続して、ウィジェットの有効/無効状態が変化するたびに発信します。
番号 3 が最も可能性が高いようですが、少し複雑です。それだけの価値があるため、このモデルを使用して一度に 1 つの項目ビューのみを表示します。
希望のコード:
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 つのモデルの複数のビューでは機能しません。