gpt4 book ai didi

c++ - 从 QML 索引访问列表

转载 作者:行者123 更新时间:2023-11-28 04:19:26 25 4
gpt4 key购买 nike

在我的程序中,我有一个树状对象架构,我需要从 QML 访问这些对象。我不知道如何创建一个 Q_PROPERTY getter 函数,它允许我访问我选择的索引处的项目。该函数在 C++ 部分看起来像这样:

/**
* @brief Risk object getter function.
* @param index: The index of the risk from the \ref m_risks container.
* @return Pointer to the risk object if \p index is valid. Otherwise 0.
*/
CRiskData* CVessel::getRisk(const int index)
{
if (index >= m_risks.length())
return nullptr;

return m_risks[index];
}

但是这个QML <-> Qt property communication system似乎只允许一个没有输入参数的getter。我试着这样定义它:

Q_PROPERTY(CRiskData* risk READ getRisk)

我得到一个编译器错误,没有找到匹配的函数:

moc_cvessel.cpp:122: error: no matching function for call to 'CVessel::getRisk()'
case 0: *reinterpret_cast< CRiskData**>(_v) = _t->getRisk(); break;
^

所以 MOC 创建了没有输入参数的函数......有没有办法解决?目标是能够以分层方式从 QML 端访问对象的每个元素。

最佳答案

看看你的问题,我认为你应该使用与 MVVM ( https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel ) 或 MVC 相关的东西。因此,您应该通过子类化 QAbstractItemModel 创建您自己的暴露给 QML 的 C++ 模型。在此模型中,在您的列表模型中创建一个 Q_INVOKABLE 方法:

容器.hpp:

#ifndef CVESSEL_HPP
#define CVESSEL_HPP

#include <QAbstractItemModel>
#include <QList>
class CRiskData;

class CVessel: public QAbstractItemModel
{
Q_OBJECT

public:
CVessel(QObject * parent = nullptr);
Q_INVOKABLE CRiskData* getRisk(const int index);
static void declareQML();

// QAbstractItemModel subclassing & rest of the header

protected:
QList<CRiskData *> m_risks;
};

#endif // CVESSEL_HPP

容器.cpp:

#include "cvessel.hpp"
#include <QQmlEngine>
#include "criskdata.hpp"

CVessel::CVessel(QObject * parent = nullptr) :
QAbstractItemModel(parent),
m_risks()
{}

CRiskData* CVessel::getRisk(const int index);
{
if (index >= m_risks.length())
return nullptr;

return m_risks[index];
}

void CVessel::declareQML() {
qmlRegisterType<CVessel>("Bremen", 3, 14, "CVessel");
}

// Rest of implementation

风险组件.qml:

import QtQuick 2.12
import Bremen 3.14

Item {
id: risk_component

// ...

TreeItem {
id: the_tree
model: CVessel {}

// ...
}

// ...

function usingARisk(riskIndex) {
var risk = risk_component.the_tree.model.getRisk(riskIndex)

// Using your risk on the QML side. For Example:
console.log(qsTr("Risk level: %1").arg(risk.level))
}

// ...

}

主要.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include "criskdata.hpp"
#include "cvessel.hpp"

int main(int argc, char ** argv) {
QApplication app(argc, argv);

//...

CRiskData::declareQML(); // Of course if you use it on the QML side.
CVessel::declareQML();

//...

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
int res = engine.rootObjects().isEmpty() ? -1 : app.exec();

//...

return res;
}

有关模型子类化的更多信息,请查看 the "Model/View Programming" page在 Qt 文档中,特别是在 the "Model Subclassing Reference" section .

关于c++ - 从 QML 索引访问列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55807548/

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