首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QAbstractTableModel更新背景色

QAbstractTableModel更新背景色
EN

Stack Overflow用户
提问于 2019-09-16 09:54:51
回答 1查看 1.2K关注 0票数 1

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

数据( const QModelIndex &index,int角色)

我试图如下所示,只更改表行的背景色,但它似乎不像建议的那样工作:

代码语言:javascript
复制
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();
}

我打电话给你

在下面的代码中发出dataChanged:

代码语言:javascript
复制
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;
}

为了获得更多信息,我定义了以下角色:

代码语言:javascript
复制
enum TableRoles {
        TableDataRow = Qt::UserRole + 1,
        HeadingRow
    };

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

代码语言:javascript
复制
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)
        }
    }
}
代码语言:javascript
复制
Rectangle {
      color: "transparent"
      Layout.fillWidth: true
      Layout.preferredHeight: parent.height - 250

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-16 10:34:48

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

代码语言:javascript
复制
if (index.isValid())
{
    if (role == Qt::DisplayRole)
    {
        return QString("hello data");
    }
    else if (role == Qt::BackgroundRole)
    {
        return QColor(Qt::lightGray);
    }
}

除此之外,您的代码应该运行良好。你能看到你的数据值吗?您不应该返回数据,因为如果角色是Qt::DisplayRole,则不返回数据。你确定,你把你的模型和你的QTableView和setModel();连接起来了吗?

编辑:来自文档:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57954368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档