QML TableView 模型静默失败?

Posted

技术标签:

【中文标题】QML TableView 模型静默失败?【英文标题】:QML TableView Model Silently Failing? 【发布时间】:2020-11-02 15:05:18 【问题描述】:

编辑:添加了一些说明

使用 QML 5.14

TableView 的model 属性似乎不想显示QList<int>int 的任何变体,无论是qint8qint32 等。我可以使它与无符号@ 一起使用987654327@,但是我需要在我的应用程序中保留负值范围。

我发现信息正在进入 qml 层,因为当我调用时:

console.log("cfs.amounts is " + cfs.amounts)
console.log("model is " + model)
console.log("modellength is " + model.length)

我实际上得到了预期的控制台输出:

qml: cfs.amounts is 11,12
qml: model is 11,12
qml: modellength is 2

我通过直接向 TableView 传递数据(即 model: [11, 22])确保 TableView 正常工作,并且它正确显示,即它显示索引 0, 1。但是,当我将cfs.amounts 传递给它时,我根本无法让它显示任何东西,这是c++ 中的QList<int>。所以根据console.log,模型数据在那里,它是正确的,它从c++传递到qml没有问题,而且长度很好——TableView只是无法显示它。

我唯一能想到的是,TableView 默默地无法显示带符号整数的数组。但是我也可能完全错了,因为我无法获得 Repeater项目在其model 中识别它,也不是。我已经搜索过,但我找不到关于这个主题的任何错误报告。有人对如何让 qml 模型识别通过的 QList<int> 有任何建议吗?这一切都在 QML 5.14 中。

cashflowschedule.h

#ifndef CASHFLOWSCHEDULE_H
#define CASHFLOWSCHEDULE_H

#include "QObject"
#include "QList"

class CashFlowSchedule : public QObject

    Q_OBJECT
    Q_PROPERTY(QList<int> amounts READ amounts)

public:
    CashFlowSchedule() ;
    QList<int> amounts()  return 11,12; 
;

#endif // CASHFLOWSCHEDULE_H

ma​​in.qml

import QtQuick 2.14
import QtQuick.Window 2.14
import cpps 1.0

Window 
    visible: true
    width: 640
    height: 480

    CashFlowSchedule  id: cfs 

    TableView 
        anchors.fill: parent
        model: cfs.amounts
        delegate: Text  text: index 
        Component.onCompleted: 
            console.log("cfs.amounts is " + cfs.amounts)
            console.log("model is " + model)
        
    

包含在 main.cpp 中

#include "cashflowschedule.h"
...
    qmlRegisterType<CashFlowSchedule>("cpps", 1, 0, "CashFlowSchedule");
...    

【问题讨论】:

现在,您使用的是text: index,它只会显示索引。你试过text: modelData吗? 正确。我打算只显示索引。目前,text: index 没有显示任何内容 编辑:而且,text: modelData 的行为也类似。 QVariantList 也有其固有的缺陷......比如它根本不起作用。 这能回答你的问题吗? QList<int> cannot be used as a model for Repeater 【参考方案1】:

QList&lt;int&gt; 不是用于模型的官方支持的 C++ 类型之一(参见列表here)。 bug report 的存在是为了澄清关于这一点的文档。 QVariantList 是一个很好的替代方案。

【讨论】:

以上是关于QML TableView 模型静默失败?的主要内容,如果未能解决你的问题,请参考以下文章

这种将 C++ QStringList 加载为 QML ListView 模型的方式有啥问题?

QML TableView 鼠标区域不会将点击传播到选择模型

如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?

Qt5 - 在 QML TableView 中显示动态数据模型

Pyside2:使用属性更新 QML TableView 模型

CREATE TABLE 语句在 executeBatch 下静默失败