gpt4 book ai didi

c++ - QList> 传入 QML

转载 作者:太空狗 更新时间:2023-10-29 20:34:53 24 4
gpt4 key购买 nike

我试图将 2d QList 作为 Q_PROPERTY 传递到 QML,但是,在 QML 内部,我无法实际访问任何信息。

一些代码:

C++:q_property 由构造函数中的 q_invokable 函数填充:

void Class::createNewGameArray(){
QList<QList<QString>> testArray;

for( int i = 0; i < _intervals.size(); ++i) {
QList<QString> innerArray;
testArray.append(innerArray);
testArray[i].append(_intervals[i]);
testArray[i].append("Audio");
}
for( int i = 0; i < _intervals.size(); ++i) {
QList<QString> innerArray;
testArray.append(innerArray);
testArray[i+12].append(_intervals[i]);
testArray[i+12].append("Text");
}
std::random_shuffle(testArray.begin(),testArray.end());
Class::setGameArray(testArray);
emit gameArrayChanged(_newGameArray);

返回这个:

(("M7", "Text"), ("M3", "Text"), ("m3", "Text"), ("M6", "Audio"), ("TT", "Audio"), ("P4", "Text"), ("m7", "Audio"), ("m2", "Text"), ("m6", "Audio"), ("m6", "Text"), ("M7", "Audio"), ("P5", "Text"), ("P4", "Audio"), ("m2", "Audio"), ("M2", "Audio"), ("M3", "Audio"), ("P5", "Audio"), ("m3", "Audio"), ("M6", "Text"), ("TT", "Text"), ("m7", "Text"), ("Oct", "Audio"), ("Oct", "Text"), ("M2", "Text"))

正是我想要的。

我在 main.cpp 中设置了 rootContext:

Class object;

QQmlApplicationEngine engine;
QQmlContext* context = engine.rootContext();

context->setContextProperty("object", &object);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

然而,在 qml 中我只得到

qml: QVariant(QList<QList<QString> >)

而且我实际上无法用它做任何事情。

理想情况下,我的目标是能够以这种方式从 qml 访问 2d qlist:

object.gameArray[0][1] // return "Text"

我可以使用常规 QList(没有 2d)来做到这一点。任何帮助将不胜感激!

最佳答案

QML 本身并不理解 QList,因此通常不可能传入任何类型 T 的 QList 并让 QML 能够访问列表中的项目。

但是,QML 引擎确实内置了对一些特定类型的 QList 的支持:

  • QList<QObject *>
  • QList<QVariant>
  • QStringList - (不是 QList<QString> !!!)

因此,如果您可以使用上述 3 种类型的任意组合来构建您的列表列表,那么您就可以获得一个可行的解决方案。在您的用例中,我建议采用以下结构:

QList<QVariant(QStringList)>

在我们尝试之前的最后一个注意事项...仅仅因为这可行,并不一定意味着它是个好主意。 QList 内容在运行时被复制到 Javascript 数组,因此从 C++ 对任何列表的任何微小更新都将导致整个列表被重建为一个新的 Javascript 数组,这可能是昂贵的。

现在,让我们试试吧

我的类.h

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QStringList>
#include <QVariant>

class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QVariant> variantList READ variantList NOTIFY variantListChanged)

public:
explicit MyClass(QObject *parent = nullptr) : QObject(parent),
m_variantList({
QStringList({ "apple", "banana", "coconut" }),
QStringList({ "alice", "bob", "charlie" }),
QStringList({ "alpha", "beta", "gamma" })
}) { }

QList<QVariant> variantList() const { return m_variantList; }

signals:
void variantListChanged();

public slots:

private:
QList<QVariant> m_variantList;
};

#endif // MYCLASS_H

主.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

ApplicationWindow {
visible: true
width: 640
height: 480

Column {
id: column

// will add the strings here from the handler below
}

Component.onCompleted: {
console.log("variantList length %1".arg(myClass.variantList.length))

for (var i = 0; i < myClass.variantList.length; i++) {

console.log("stringList %1 length %2".arg(i).arg(myClass.variantList[i].length))

for (var j = 0; j < myClass.variantList[i].length; j++) {
// print strings to the console
console.log("variantList i(%1), j(%2) = %3".arg(i).arg(j).arg(myClass.variantList[i][j]))

// add the strings to a visual list so we can see them in the user interface
Qt.createQmlObject('import QtQuick 2.7; Text { text: "i(%1), j(%2) = %3" }'.arg(i).arg(j).arg(myClass.variantList[i][j]), column)
}
}
}
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myclass.h"

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;

MyClass myClass;
engine.rootContext()->setContextProperty("myClass", &myClass);

engine.load(QUrl(QLatin1String("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

return app.exec();
}

运行时输出

qml: variantList length 3
qml: stringList 0 length 3
qml: variantList i(0), j(0) = apple
qml: variantList i(0), j(1) = banana
qml: variantList i(0), j(2) = coconut
qml: stringList 1 length 3
qml: variantList i(1), j(0) = alice
qml: variantList i(1), j(1) = bob
qml: variantList i(1), j(2) = charlie
qml: stringList 2 length 3
qml: variantList i(2), j(0) = alpha
qml: variantList i(2), j(1) = beta
qml: variantList i(2), j(2) = gamma

visual output

... 它有效:)

关于c++ - QList<QList<QString>> 传入 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805244/

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