Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据不显示在TableView中 我尝试用C++构建模型的简单TabLVIEW。我的表的行数和列数与返回的rowCount和columnCount方法相同。这意味着,模型与视图“连接”,但在每个单元格中不显示消息:“某些数据”_C++_Qt_View_Model_Qml - Fatal编程技术网

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

数据不显示在TableView中 我尝试用C++构建模型的简单TabLVIEW。我的表的行数和列数与返回的rowCount和columnCount方法相同。这意味着,模型与视图“连接”,但在每个单元格中不显示消息:“某些数据”,c++,qt,view,model,qml,C++,Qt,View,Model,Qml,这是我的密码: class PlaylistModel : public QAbstractTableModel { Q_OBJECT public: PlaylistModel(QObject *parent=0): QAbstractTableModel(parent), rows(0){} int rowCount(const QModelIndex & /*parent*/) const { return 5; }

这是我的密码:

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 }

            }

我哪里出错了?

您没有实现
索引
方法

据文献记载,

当子类化QabstracteModel时,至少您必须 实现索引()、父项()、行计数()、列计数()和数据()。 这些函数用于所有只读模型,并构成基础 可编辑模型的定义

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

如果你不想玩这些游戏,只想实现你自己的快速和脏模型,考虑子类QStaldItMeMeltudio. 简短回答 因为您的QML没有要求

Qt::DisplayRole
。将您的
TableVievColumn
更改为

TableViewColumn { role: "display"; title: "xxx"; width: 20 }
QML现在要求使用
Qt::DisplayRole
,此列显示“一些数据”

长话短说 QML要求三个用户定义的角色:“id”、“名称”和“持续时间”。然而,这三个角色并不是构建在角色中的。因此,您需要在模型类中实现这三个角色

首先,您应该为模型提供一组角色。模型使用
qabstractemmodel::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();
}
接下来,为每个角色提供一个字符串到int的映射。模型中的
角色
是int类型,而在QML中
角色
是string类型。(请参见
TableViewColumn
中的角色属性)因此,我们应该为每个角色提供一个字符串到int的映射,以便QML能够正确地请求所需的数据。映射应在
qabstractemmodel::roleNames()中提供:

QHash播放模型::roleNames()常量
{
QHash角色映射;
角色映射[IdRole]=“id”;
roleNameMap[NameRole]=“名称”;
角色名称映射[DurationRole]=“duration”;
返回角色地图;
}
最后,QML中的表现在可以显示所需的内容

一些参考资料 子类化时

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

使用时

QAbstractItemModel子类的角色可以通过重新实现QAbstractItemModel::roleNames()向QML公开


如果不重新实现
roleNames
函数,则只能使用中声明的默认角色。这就是为什么简短答案有效。

我的代码在使用QTableView小部件时有效,但在使用qml TableView时无效。正如您所建议的,我添加了两个方法,但仍然没有在每个单元格中获得“某些数据”消息。我编辑了我的代码。请检查此方法。@iwaszek12似乎一切正常。也许这是QML的问题?可能存在一些标志和角色问题?尝试:a)删除
if(role==Qt::DisplayRole)
条件并为任何角色返回“一些数据”。b) 将其更改为if(role==Qt::DisplayRole | | role==Qt::EditRole)
,并在else中不返回
QVariant()
,而是返回qbstractemmodel::data(index…)。使用QWidget还解决了以下问题:如果角色不是DisplayRole,则数据函数需要返回无效的QVariant
QHash<int, QByteArray> PlaylistModel::roleNames() const
{
    QHash<int, QByteArray> roleNameMap;
    roleNameMap[IdRole] = "id";
    roleNameMap[NameRole] = "name";
    roleNameMap[DurationRole] = "duration";

    return roleNameMap;
}