为 QML TreeView 创建模型

2024-03-14

我正在尝试使用 QML TreeView 模型。 Qt 的示例不包括如何创建模型。我读了这个post https://stackoverflow.com/questions/40433038/qml-treeview-not-updating-at-runtime-after-adding-new-data-to-the-model/并尝试使用@Tarod 的代码,但结果不是我所期望的。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "animalmodel.h"
#include <qqmlcontext.h>
#include <qqml.h>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    AnimalModel model;
    model.addAnimal("wolf", "Medium");
    model.addAnimal("Bear", "Large");

    QQmlApplicationEngine engine;
    QQmlContext *ctxt = engine.rootContext();
    ctxt->setContextProperty("myModel", &model);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

动物模型.h

#ifndef ANIMALMODEL_H
#define ANIMALMODEL_H

#include <QStandardItemModel>


class AnimalModel : public QStandardItemModel
{
    Q_OBJECT //The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.
public:
    enum AnimalRoles {
        TypeRole = Qt::UserRole + 1,
        SizeRole
    };

    AnimalModel(QObject *parent = 0);

    Q_INVOKABLE void addAnimal(const QString &type, const QString &size);

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

protected:
    QHash<int, QByteArray> roleNames() const;
};

#endif // ANIMALMODEL_H

动物模型.cpp

#include "animalmodel.h"

AnimalModel::AnimalModel(QObject *parent)
    : QStandardItemModel(parent)
{

}

void AnimalModel::addAnimal(const QString &type, const QString &size)
{
    QStandardItem* entry = new QStandardItem();
    entry->setData(type, TypeRole);

    auto childEntry = new QStandardItem();
    childEntry->setData(size, SizeRole);
    entry->appendRow(childEntry);

    appendRow(entry);
}

QVariant AnimalModel::data(const QModelIndex & index, int role) const {
    QStandardItem *myItem = itemFromIndex(index);

    if (role == TypeRole)
        return myItem->data(TypeRole);
    else if (role == SizeRole) {
        if (myItem->child(0) != 0)
        {
            return myItem->child(0)->data(SizeRole);
        }
    }
    return QVariant();
}

QHash<int, QByteArray> AnimalModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[TypeRole] = "type";
    roles[SizeRole] = "size";
    return roles;
}

main.qml

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.4


ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    menuBar: MenuBar {
        Menu {
            title: qsTr("&File")
            MenuItem {
                text: qsTr("&Open")
                onTriggered: messageDialog.show(qsTr("Open Action Triggered"));
            }
            MenuItem {
                text: qsTr("&Exit")
                onTriggered: Qt.quit();
            }
        }
    }


    TreeView {
        anchors.fill: parent
        model: myModel
        TableViewColumn {
            title: "Name"
            role: "type"
            width: 300
        }
        TableViewColumn {
            title: "Size"
            role: "size"
            width: 300
        }
    }
}

我得到的是这样的:Result https://i.stack.imgur.com/6WhFg.png

我想要的是作为动物类型的孩子的动物大小。


模型子类化是 At 中最严重的雷区之一。建议始终是让它通过模型测试(https://wiki.qt.io/Model_Test https://wiki.qt.io/Model_Test)看看一切是否都正确实施。

另一方面,在 90% 的情况下,您根本不需要子类化模型,因为 Qt 提供的默认模型工作得很好。我要做的就是使用 QStandardItemModel 在 C++ 端仅使用 QAbstractItemModel 接口(即强迫自己使用QAbstractItemModel* model = new QStandardItemModel(/*parent*/);)这样,如果将来您觉得确实需要重新实现模型(为了提高效率),您只需要更改现有代码中的 1 行即可。

在你的情况下:

void AnimalModel::addAnimal(const QString &type, const QString &size)
{
    if(columnCount()==0) insertColumn(0); // make sure there is at least 1 column
    insertRow(rowCount()); // add a row to the root
    const QModelIndex addedIdx = index(rowCount()-1,0);
    setData(addedIdx, type, TypeRole); // set the root data
    insertRow(rowCount(addedIdx),addedIdx ); // add 1 row ...
    insertColumn(0,addedIdx ); // ... and 1 column to the added root row
    setData(index(0,0,addedIdx), size, SizeRole); // set the data to the child

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 QML TreeView 创建模型 的相关文章

  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    我正在将之前在 NET Framework 中编写的一些代码移植到 NET Core 我有这样的事情 HttpResponseMessage result await client SendAync request if result St
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • Xcode 8 内存图显示“无选择”且无法工作

    我正在使用 Xcode 8 0 和 Swift3 处理一个项目 我想使用内存图调试器 但它什么也没显示 预期外观 来自教程 为什么我不能使用这个功能 该项目是使用 Xcode 8 创建的 不是从旧版本的 Xcode 迁移的 bitcode与
  • protractor 2.5.4 E/launcher - 会话未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 79

    我进行了大量研究并使用了各个论坛中提到的许多可能的解决方案 但没有一个对我有用 我试图在 CI CD 管道中运行它 尽管能够在本地运行量角器测试用例并能够启动浏览器 但在 CI CD 管道构建中它失败了 详细信息如下 我在 package
  • 更改已验证应用程序的应用程序名称 - Google OAuth 同意屏幕

    我有一个经过验证的应用程序 我想更改 OAuth 同意屏幕应用程序名称 仅应用程序名称 为了做到这一点 似乎我需要再次重新验证这一点 但我的应用程序现在已经在生产中 如果我提交它进行验证 当前已验证的 OAuth 屏幕是否会突然显示为未验证
  • Python 正则表达式的 unicode 文本中使用的字边界

    我想在正则表达式中使用单词边界来匹配一些 unicode 文本 Unicode 字母在 Python 正则表达式中被检测为单词边界 如下所示 gt gt gt re search r by b y lt sre SRE Match obje
  • 如何正确卸载python jupyter?

    I have jupyter安装有python3 5 on my Mac OSX 但我想要python2 7版本 所以 我基本上需要卸载3 5版本 然后重新安装2 7版本 但由于某种原因我无法卸载3 5版本 我试过sudo python3
  • Python中使用行数作为输入变量分割大文本文件的快速方法

    我使用行数作为变量来分割文本文件 我编写这个函数是为了将吐出的文件保存在临时目录中 除最后一个文件外 每个文件有 4 百万行 import tempfile from itertools import groupby count temp
  • 如何避免 AS3 代码混乱

    我使用 ActionScript 3 进行编程已经有一段时间了 我注意到我的代码的自然进展似乎采用一个巨大的文档类的形式 其中包含数十个成员变量 回调和舞台上对象的句柄 简而言之 有点乱 问题是 我真的没有找到解决办法 至少目前还没有 我在
  • 不使用提交按钮提交表单

    我正在使用表单提交数据以从数据库中获取记录 在表单中 我使用两个选择标签选项 因此 选择选项后 表单应提交不使用提交按钮 我正在等待选择输入后提交表单的响应 而不使用它应该自动提交的提交按钮 或任何按钮 创建一个函数来检查您想要的所有内容是
  • 在java中连接两个json对象

    我想连接多个 json 对象 我有两个像这样的json message test status 0 and this message test 2 status 1 结果必须是 message test status 0 message t
  • Kotlin 多平台“转到声明”转到反编译代码

    当使用 Android Studio 的 转到声明 功能 cmd 单击 时 尽管源位于我的项目中 但会显示反编译的源 kotlin MP 源位于另一个模块中 我可以使用 选择源 选项连接源 但是我必须对每个文件执行此操作 是否有用于连接到正
  • Azure B2C 问题和疑问

    我已经使用 Azure B2C 几天了 有一些问题和疑问 它创建的用于重定向登录的 URL 格式不正确 它包含两次问号 在网址之后 在配置文件名称之后再次 这会在您每次登录 注销等时导致 404 未找到错误 例如 它尝试重定向到的登录 UR
  • C# 空条件运算符和等待错误

    在 C 中使用新的 null 条件运算符时 我遇到了一个有趣的 System NullReferenceException 如果 MyObject 为 null 以下代码将给出 NullReferenceException await th
  • 如何从我的 MySQL 表中删除约束?

    我想从我的表中删除约束 我的查询是 ALTER TABLE tbl magazine issue DROP CONSTRAINT FK tbl magazine issue mst users 但我收到一个错误 1064 您的 SQL 语法
  • 从 RGB 整数转换为十六进制

    我拥有的是 R 255 G 181 B 178 我正在 C 中工作 对于 WP8 更具体地说 我想将其转换为十六进制数字以用作颜色 以设置 WriteableBitmap 的像素颜色 我正在做的事情如下 int hex 255 lt lt
  • 调整绘图标题(主要)位置

    我一直无法找到一种方法来使用 par 来调整 R 中绘图和主标题之间的 垂直 距离 在这个例子中 plot 1 1 main Title 我可以使用以下方法调整轴标题的位置 par mgp c 2 5 1 0 但我认为没有办法类似地调整主标
  • 在 Pyspark 中将稀疏向量转换为密集向量

    我有一个像这样的稀疏向量 gt gt gt countVectors rdd map lambda vector vector 1 collect SparseVector 13 0 1 0 2 1 0 3 1 0 6 1 0 8 1 0
  • 可编辑的同步排序顺序

    如何实现 Firestore 以便用户可以对数组中的项目进行排序并同步排序顺序 例如 在待办事项列表中订购项目 我可以想出两种选择 但他们感觉不是好主意 在指定索引处插入项目 但我不确定如何或是否可以使用 Firestore 做到这一点 每
  • 多次碰撞的 Sprite Kit 碰撞

    我已经查看并找到了单一碰撞的答案 但我正在寻找一种方法来检测多种类型的碰撞 我正在制作一个游戏 其中有 3 个我想要的碰撞 用户飞机与敌方子弹碰撞 用户子弹与敌机碰撞 我已经在工作 以及敌方子弹和用户子弹碰撞 我已设置并正确设置所有cate
  • python pandas 删除重复的列

    从数据框中删除重复列的最简单方法是什么 我正在通过以下方式读取具有重复列的文本文件 import pandas as pd df pd read table fname 列名称是 Time Time Relative N2 Time Tim
  • 为 QML TreeView 创建模型

    我正在尝试使用 QML TreeView 模型 Qt 的示例不包括如何创建模型 我读了这个post https stackoverflow com questions 40433038 qml treeview not updating a