- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图将 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 数组,这可能是昂贵的。
现在,让我们试试吧
#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
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)
}
}
}
}
#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
... 它有效:)
关于c++ - QList<QList<QString>> 传入 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805244/
我对 Qt Qlist 容器有一个有趣的问题。尝试将 QList append 到 QList 会使我的迭代器指向内存的未知部分。 QList listSmall; QList> listBig; f
我对 documentation. 的 QList 复制构造函数感到困惑 QList::QList ( const QList & other ) Constructs a copy of other
我试图在运行时将项目附加到 QList,但运行时出现错误消息。基本上我想做的是制作一个 QList 的 QList 并向每个内部列表添加一些 customClass 对象。这是我的代码: 小部件.h:
所以我有一个名为 AppointmentSchedule 的类,它属于以下类型: namespace Ui { class AppointmentSchedule; } class Appointme
我正在使用 Qt5 用 C++ 编写一个视频抓取应用程序。我正在关注他们的示例代码并查看获取相机信息的文档: http://doc.qt.io/qt-5/qcamerainfo.html 我遇到的问题
我试图将 2d QList 作为 Q_PROPERTY 传递到 QML,但是,在 QML 内部,我无法实际访问任何信息。 一些代码: C++:q_property 由构造函数中的 q_invokabl
我有以下方法(只有 1 个参数),我想对其进行调整以用于 1 个以上的参数。我尝试使用默认参数,但这不起作用。 (只有旧方法的原始代码工作正常)令我印象深刻的是该声明中省略了变量名。 为什么? 这是我
在我的 mainwindow.h 中,我有一个 QList m_qlServoList,它应该存储指向 Servo 对象的指针: QList m_qlServoList; 当我尝试将新的伺服指针 ap
有没有简单的方法来复制QList从新 QList 中的位置 a 到 b? 我测试过: QList newList(list.begin()+5,list.end()); 但它不起作用。我收到错误消
我找不到使用另一个类模板将 QObjects 的 QList 转换为另一个 QList 的方法。我有一个创建 QObjects 实例然后返回 QList 的函数。所以我的问题是,我可以将 QList
有没有简单的方法来创建 QList来自 QList ? (不迭代 QList 并将每个元素添加到 QList ) 最佳答案 答案是否定的。你怎么可能在不迭代的情况下将一个转换成另一个?即使您正在使用某
我有几个属性类型为 QList 的类.我使用原始指针来表示所有权。此访问器将返回 QList>因为我们不想分发原始指针。问题是目前每个访问器或多或少看起来像下面这样: QList> values; C
我正在尝试使用 QT 框架获取存储在 QList 中的帐户列表的总余额。 我的问题是总余额需要从不允许我这样做的类中访问 protected 成员余额。 这个问题来自大学的作业,问题已经给了我程序的
学习C++,所以要温柔:)... 我一直主要使用堆变量(来自 C)来设计我的应用程序,所以我设计了这样的结构: QList _Criteria; // ... Criteria *c = new Cr
因此主题行中提到的代码会导致 Qt 4.8.3 和 gcc 4.7.2 出现段错误 这在 .cpp 文件中的任何类/结构之外,适用于 gcc 4.4 const QList warnings = QL
我最近一直在从事一个项目。当我尝试运行项目时,出现此错误: /ASSERT failure in QList::operator[]: "index out of range", file /usr/
我对 QT 没有太多经验,今天出现了这个问题。 QList memList; const int large = 100000; getchar(); for (int i=0; i
我明白了qCopy ,和 qCopybackward但似乎都不让我以相反的顺序复印。 qCopybackward 仅以相反的顺序复制它,但使该死的元素保持相同的顺序!我想做的就是以相反的顺序返回列表的
typedef struct { char *u8_testStep; char *u8_functionTested; char *u8_testDescription;
我有一个应用程序,其目的是获取按键值并将其放入 QList 中。但是,每次我调用处理 QList 修改的类成员函数时,成员变量 QList 都会被重置。我相信我有范围问题,但我不知道在哪里。这是我的代
我是一名优秀的程序员,十分优秀!