gpt4 book ai didi

c++ - 为 QML TreeView 创建模型

转载 作者:行者123 更新时间:2023-11-30 02:24:39 26 4
gpt4 key购买 nike

我正在尝试使用 QML TreeView 模型。 Qt 中的示例不包括如何创建模型。我读了这个post并尝试使用来自@Tarod 的代码,但结果不是我所期望的。

主要.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;
}

主.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

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

最佳答案

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

另一方面,在 90% 的情况下,您根本不需要对模型进行子类化,因为 Qt 提供的默认模型工作得很好。我要做的只是使用 QStandardItemModel,在 C++ 方面,仅使用 QAbstractItemModel 接口(interface)(即强制自己使用 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

}

关于c++ - 为 QML TreeView 创建模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45166367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com