1

对于 myQAbstractItemModel中的某些列,我需要文本以特殊颜色显示。我通过在data()where 中返回该颜色来做到这一点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);
}

自然,这不适用于单个模型上的多个视图。

4

0 回答 0