如何从QAbstractItemModel返回特殊文本颜色,具体取决于其启用/禁用的窗口小部件

时间:2015-01-26 22:23:39

标签: c++ qt qabstractitemmodel qabstractitemview

对于QAbstractItemModel中的某些列,我需要文本以特殊颜色显示。我这样做的方法是在data() role == Qt::TextColorRole中返回该颜色。这很好,直到显示此模型的视图被禁用,那些特殊的颜色仍然是“明亮的”。所有其他文字都是灰色/静音。

是否有一种简单的方法可以在禁用窗口小部件时返回​​特殊颜色?

失败(或过于复杂)的想法:

  1. 返回带有正确颜色的QPalette表单data()以启用/禁用 - 不起作用(也不记录)
  2. 检查QAbstractItemModel::flags() - 基类不知道小部件(也不应该)
  3. 将窗口小部件中的信号连接到我的模型,以便在窗口小部件的启用/禁用状态发生变化时发出。
  4. 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);
    }
    

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

0 个答案:

没有答案