繁体   English   中英

数据未显示在TableView中

[英]Data is not displayed in TableView

我尝试使用C ++中的模型构建简单的TableView。 我的表具有与返回rowCount和columnCount方法一样多的行和列。 这意味着,模型已与视图“连接”,但在每个单元格中均不显示以下消息:“某些数据”

这是我的代码:

class PlaylistModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    PlaylistModel(QObject *parent=0): QAbstractTableModel(parent), rows(0){}

    int rowCount(const QModelIndex & /*parent*/) const
    {
        return 5;
    }
    int columnCount(const QModelIndex & /*parent*/) const
    {
        return 3;
    }
    QModelIndex index(int row, int column, const QModelIndex &parent) const {
         return createIndex(row, column);
    }
    QModelIndex parent(const QModelIndex &child) const {
         return child.parent();
    }
    QVariant data(const QModelIndex &index, int role) const{
        if (role == Qt::DisplayRole)
             {
               return QString("Some data");
             }
        return QVariant();
    }
(...)
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
PlaylistModel plModel(0);
engine.rootContext()->setContextProperty("myModel", &plModel);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

和qml

TableView {
                id: trackList
                width: 100; height: 100
                model: myModel
                TableViewColumn { role: "id"; title: "Id"; width: 30 }
                TableViewColumn { role: "name"; title: "Name"; width: 100}
                TableViewColumn { role: "duration"; title: "Duration"; width: 20 }

            }

我在哪里弄错了?

简短答案

因为您的QML不需要Qt::DisplayRole 将您的TableVievColumn更改为

TableViewColumn { role: "display"; title: "xxx"; width: 20 }

QML现在要求Qt::DisplayRole ,并且在此列中显示“某些数据”。

长答案

QML要求三个用户定义的角色:“ id”,“ name”和“ duration”。 但是,这三个角色不是临时角色。 因此,您需要在模型类中实现这三个角色。

首先,您应该为模型提供一组角色。 该模型使用QAbstractItemModel::data函数将数据返回到视图。 role的类型是int,我们可以在模型类中编写一个枚举:

class PlaylistModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    enum MyTableRoles 
    {
        IdRole = Qt::UserRole + 1,
        NameRole,
        DurationRole
    }
    //...
};

现在,在data函数中,无论何时视图问,都将返回相应的值:

QVariant PlaylistModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()){return QVariant();}

    switch(role)
    {
    case IdRole:
        return GetIdFromMyTable(index);
    case NameRole:
        return GetNameFromMyTable(index);
    case DurationRole:
        return GetDurationFromMyTable(index);
    }
    //...
    return QVariant();
}

接下来,为每个角色提供一个字符串到整数的映射。 role的模型是int类型,但是在QML的role是字符串类型。 (请参见TableViewColumn的role属性。)因此,我们应该为每个角色提供一个字符串到int的映射,以便QML可以正确地请求所需的数据。 映射应在QAbstractItemModel::roleNames()

QHash<int, QByteArray> PlaylistModel::roleNames() const
{
    QHash<int, QByteArray> roleNameMap;
    roleNameMap[IdRole] = "id";
    roleNameMap[NameRole] = "name";
    roleNameMap[DurationRole] = "duration";

    return roleNameMap;
}

最终,您现在在QML中的表可以显示所需的内容。

一些参考

子类化QAbstractTableModel时

您必须实现rowCount(),columnCount()和data()。 QAbstractTableModel提供了index()和parent()函数的默认实现。

在QML中使用C ++模型时

通过重新实现QAbstractItemModel :: roleNames(),可以将QAbstractItemModel子类的角色暴露给QML。

而且,如果不重新实现roleNames函数,则只能使用QAbstractItemModel :: roleNames中声明的默认角色。 这就是简短答案有效的原因。

您尚未实现index方法。

根据文档,

子类化QAbstractItemModel时,至少必须实现index() ,parent(),rowCount(),columnCount()和data()。 这些功能在所有只读模型中使用,并构成可编辑模型的基础。

换句话说,您必须实现自己的低级项目管理,AbstractItemModel不会为您执行此操作。 您应该使用createIndex创建索引,并在必要时销毁它们。

如果您不想玩这些游戏,而只想实现自己的快速脏模型,请考虑将QStandardItemModel子类化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM