在 QML TableView 中显示 QStandardItemModel

Posted

技术标签:

【中文标题】在 QML TableView 中显示 QStandardItemModel【英文标题】:Display QStandardItemModel in a QML TableView 【发布时间】:2014-05-05 15:09:32 【问题描述】:

我正在尝试使用 QML 中的 Qt Controls TableView 显示 QStandardItemModel 子类。

模型类如下所示:

class CommandModel : public QStandardItemModel 

Q_OBJECT

public:
    CommandModel(QObject *parent = 0);

private slots:
    void startProcess(); 
    // and other thing that only fetch data and use appendRow()
    // to add the data to the model.
;

模型当前是一个包含两列的表(命令名称及其描述)。

我使用 QQmlApplicationEngine 和 QQuickWindow 来显示 QML。

QML 代码如下:

TableView 
    id: tableview
    model: commandModel

    TableViewColumn 
        title: qsTr("Command")
        role: "name"
    
    TableViewColumn 
        title: qsTr("Description")
        role: "description"
    

TableView 被显示,显示行(如果我没记错的话,行数是正确的)但它们只是空白行。

模型在完成加载之前被传递到 QML 上下文。我不认为这是问题,因为我首先看到一个空表,然后是一个有许多空行的表。

我不知道如何定义哪个列对应哪个角色。

欢迎并感谢任何帮助。

编辑:代码可以在这里找到:https://github.com/martinqt/Symfony2Helper

EDIT2:我通过重新实现 roleNames 得到了一个随机工作的第一列(或者看起来如此,因为它随机奇怪)。

EDIT2.1:事实上,显示第一列的技巧是 setItemRoleNames()。

EDIT3:问题更像this。我去试试看能不能解决。

解决方案:this 解决整个问题。实现 data() 和 roleNames()。 (如果您不想使用枚举,则不必使用)。

【问题讨论】:

我没有超载它。我做了一个尝试,在那里放了一个 qDebug 但它没有被调用(其他 qDebug 确实产生了输出)。我试图实现行和列计数,但它们似乎也没有被调用。我没有使用 QAbstractItemModel。引用文档QStandardItemModel implements the QAbstractItemModel interface。也许我做错了,我对 C++ 中的 Qt 模型没有太多经验。如果您认为这是问题的原因,我应该在数据中输入什么? 【参考方案1】:

查看您的代码,问题出在以下几行:

roles[0] = "name";
roles[0] = "desc";

如您所见,您首先将“name”设置为角色 0,然后使用“desc”名称覆盖该值。尝试更改它,使它们具有不同的索引。

roles[0] = "name";
roles[1] = "desc";

您现在应该可以使用该名称。您的第二个问题来自您正在注册“desc”角色,但在 qml 中使用“description”角色。因此,修改 c++ 或 qml 中的角色名称以使其匹配。

roles[0] = "name";
roles[1] = "description";

【讨论】:

我错误地推送了这个提交。但是我提交了它,因为奇怪的是,这并没有覆盖 0 值:我有两列的名称,而如果我只放一行,我只会得到名称。当我尝试应该做的正确事情(您的最后一个代码)时,我只显示名称列。我已经测试过该模型确实具有描述列的数据并且它们正确存在。我尝试了不同的索引(甚至 -1)、换行、更改了 C++ 和 QML 中的角色名称,但第二列仍然拒绝显示。 (从未设法以任何方式显示第二个) 感谢您的帮助。

以上是关于在 QML TableView 中显示 QStandardItemModel的主要内容,如果未能解决你的问题,请参考以下文章

QML QT导入CSV文件并使用python在Tableview中显示

QML Tableview显示选定行的值

QML TableView 模型静默失败?

带有委托复选框的 QML TableView 无法显示

将 QStandardItemModel 从 C++ 传递到 QtQuick / QML TableView 并显示它

具有动态列数的 QML TableView