如何訪問 QML 中結構元素的 Qlist。我已按如下方式實作,但輸出未按預期作業。有人可以幫我如何在 qml 中獲取 qlist 結構元素的值
樣本.cpp
#include "sample.h"
int xVal[5] = {1,2,3,4,5};
int yVal[5] = {6,7,8,9,10};
Sample::Sample(QObject *parent) : QObject(parent)
{
}
void Sample::prepareList()
{
listOfObjects obj;
for(int iLoop = 0; iLoop < 5; iLoop )
{
obj.xVal = xVal[iLoop];
obj.yval = yVal[iLoop];
listObj.append(obj);
}
}
QVariant Sample::getList()
{
return QVariant::fromValue(listObj);
}
樣本.h
#ifndef SAMPLE_H
#define SAMPLE_H
typedef struct
{
int xVal;
int yval;
}listOfObjects;
Q_DECLARE_METATYPE(listOfObjects);
class Sample : public QObject
{
Q_OBJECT
public:
explicit Sample(QObject *parent = nullptr);
Q_PROPERTY(QVariant varlist READ getList)
public slots:
void prepareList();
void printList();
private:
QList<listOfObjects> listObj;
QVariant getList();
};
#endif // SAMPLE_H
主檔案
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<Sample>("Sample", 1, 0, "SampleObj");
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import Sample 1.0
Window {
id: mainWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")
property var obj: ({})
SampleObj {
id: sampleId
}
Component.onCompleted: {
sampleId.prepareList()
obj = sampleId.varlist
for(var i = 0; i < obj.length; i ) {
console.log(obj[i]) //Expected:console.log("(x, y) = " obj[i].xVal, obj[i].yVal )
}
}
}
控制臺日志給出的輸出為
qml: QVariant(listOfObjects, )
qml: QVariant(listOfObjects, )
qml: QVariant(listOfObjects, )
qml: QVariant(listOfObjects, )
qml: QVariant(listOfObjects, )
uj5u.com熱心網友回復:
使用 QVariantList 而不是 QVariant 作為回傳型別
如下代碼
。輪廓
QT = quick qml
SOURCES = \
ctestforqml.cpp \
main.cpp
resources.files = main.qml
resources.prefix = /$${TARGET}
RESOURCES = resources \
Resources.qrc
CONFIG = qmltypes
QML_IMPORT_NAME = com.demo.cppobject
QML_IMPORT_MAJOR_VERSION = 1
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS = target
HEADERS = \
ctestforqml.h
ctestforqml.h
#ifndef CTESTFORQML_H
#define CTESTFORQML_H
#include <QObject>
#include <QQmlEngine>
class CTestforQML : public QObject
{
Q_OBJECT
QML_ELEMENT
public:
Q_INVOKABLE QVariantList getData() const;
public:
explicit CTestforQML(QObject *parent = nullptr);
signals:
};
#endif // CTESTFORQML_H
ctestforqml.cpp
#include "ctestforqml.h"
#include <QJsonObject>
QVariantList CTestforQML::getData() const
{
QVariantList list;
QJsonObject json;
for (int i = 0; i < 10; i )
{
json.insert("name", "demo" QString::number(i));
json.insert("value", QString::number(i));
list.append(json);
}
return list;
}
CTestforQML::CTestforQML(QObject *parent)
: QObject{parent}
{
}
主檔案
import QtQuick
import com.demo.cppobject
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
CTestforQML {
id: testForQml
}
Component.onCompleted: {
let val = testForQml.getData()
for (let i = 0; i < val.length; i )
{
console.log(val[i].name, val[i].value);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443310.html
上一篇:通過CMake匯出使用Qt的自定義庫以用于另一個CMake專案(Windows、Mingw-w64)
下一篇:如何使用AndroidAudioManager使用QAndroidJniObject設定SpeakerphoneOn(true)?
