1

の一部の列ではQAbstractItemModel、テキストを特別な色で表示する必要があります。data()その色をwhere に返すことでこれを行っていrole == Qt::TextColorRoleます。このモデルを表示するビューが無効になるまでは問題ありませんが、他のすべてのテキストがグレー/ミュートされている間、これらの特別な色はまだ「明るい」ままです。

ウィジェットが無効になっているときに特別な色を返す簡単な方法はありますか?

失敗した (または複雑すぎる) アイデア:

  1. 有効/無効に適した色の QPalette フォームを返しdata()ます - 機能しません (文書化されていません)
  2. チェックQAbstractItemModel::flags()- 基本クラスはウィジェットについても認識していません (また、そうすべきではありません)
  3. ウィジェットからモデルにシグナルを接続して、ウィジェットの有効/無効状態が変化するたびに発信します。

番号 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 つのモデルの複数のビューでは機能しません。

4

0 に答える 0