【问题标题】:QAbstractTableModel updating background colorQAbstractTableModel 更新背景颜色
【发布时间】:2020-01-17 03:28:05
【问题描述】:

我有一个包含 3 列的表格:{"Scanned","Qty", "Item"}。如果“已扫描”和“数量”列值匹配,我会尝试突出显示特定行。我看到一些帖子说要在下面实现它

data(const QModelIndex &index, int role) const

我已经尝试如下改变表格行的背景颜色,但它似乎没有按建议工作:

QVariant TransitItemTableModel::data(const QModelIndex &index, int role) const
{
    switch (role) {
    case TableDataRow:
    {
        return table.at(index.row()).at(index.column());
    }
    case HeadingRow:
    {
        if (index.row() == 0) {
            return true;
        } else {
            return false;
        }
    }
    case Qt::BackgroundRole:
    {
        QBrush redBackground(Qt::green);
        return redBackground;

    }
    default:
        break;
    }

    return QVariant();
}

我在打电话

发出数据已更改 在下面的代码中:

bool TransitItemTableModel::setData(const QModelIndex &index, const QVariant &value,
                               int role)  {
    if (!index.isValid() || 
            index.row() < 0 || index.row() >= table.size())
        return false;

    QList<QString> list1 = value.value<QList<QString>>();
    QVector<QString> list2 = list1.toVector();

    table.replace(index.row(), list2);
    emit dataChanged(index, index, {TableDataRow});
    return true;
}

仅供参考,我定义了以下角色:

enum TableRoles {
        TableDataRow = Qt::UserRole + 1,
        HeadingRow
    };

关于 QML 代码,我使用以下代码显示为 Table.qml,代码的下部显示了使用此 Table.qml 的部分代码:

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12

TableView {
    id: root
    anchors.fill: parent
    clip: true
    signal clicked(int row, int column)
    property var columnWidths: [0.5, 0.5]   // as fractions of parent width
                                            // preferably overwrite this when using
    columnWidthProvider: function (column) { return Math.max(parent.width * columnWidths[column], 1) }

    delegate: Rectangle {
        implicitHeight: text.implicitHeight
        border.color: "#dddddd"
        color: (heading==true)?"#dddddd":"white"
        Text {
            id: text
            text: tabledata
            width: parent.width
            wrapMode: Text.Wrap
            padding: 5
        }
        MouseArea{
            anchors.fill: parent
            onClicked: root.clicked(model.row, model.column)
        }
    }
}
Rectangle {
      color: "transparent"
      Layout.fillWidth: true
      Layout.preferredHeight: parent.height - 250

      Components.Table {
          model: _transitItemTableModelAPI
          columnWidths: [0.2, 0.15, 0.65]
      }
    }

【问题讨论】:

    标签: qt


    【解决方案1】:

    你应该测试你的索引的有效性:

    if (index.isValid())
    {
        if (role == Qt::DisplayRole)
        {
            return QString("hello data");
        }
        else if (role == Qt::BackgroundRole)
        {
            return QColor(Qt::lightGray);
        }
    }
    

    除此之外,您的代码应该可以正常工作。你能看到你的数据值吗?你不应该,因为如果角色是 Qt::DisplayRole,你不会返回数据。 您确定吗,您使用setModel(); 将您的模型连接到您的 QTableView

    编辑:来自文档:

    可选角色参数可用于指定哪些数据角色 实际上已经被修改了。角色参数中的空向量 意味着所有角色都应被视为已修改。的顺序 角色参数中的元素没有任何相关性。

    emit dataChanged(index, index, {TableDataRow}); 不会更新 BackgroundRole。

    【讨论】:

    • 目前可以显示数据值,我在setData上加了代码
    • hm 如果我需要保留自定义的 TableDataRow,我应该怎么做?
    • emitData 获取 QVector 作为第三个参数。将您的自定义角色和 BachgroundRole 放入此向量中。
    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 2016-03-13
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多