msh*_*iti 4 javascript c++ arrays qt qml
所以我有一个信号:
QML:
signal qmlSendWorkflowIdsArraySignal(variant workflowIdsArray)
Run Code Online (Sandbox Code Playgroud)
JS:
sendToCppWorkflowIdsArray(arrayOfWorkflowIds);
Run Code Online (Sandbox Code Playgroud)
C++:
QObject::connect(qmlMainContentItemObject, SIGNAL(qmlSendWorkflowIdsArraySignal(QVariant)), &myController, SLOT(qmlToCppWorkflowIdsArraySlot(QVariant)));
Run Code Online (Sandbox Code Playgroud)
C++插槽:
void qmlToCppWorkflowIdsArraySlot(QVariant workflowIdsArray)
{
qDebug() << " +++++++++++++++ Cpp Array slot has been called: "<<workflowIdsArray;
}
Run Code Online (Sandbox Code Playgroud)
输出:
+++++++++++++++ Cpp Array slot has been called:
QVariant(QVariantList, (QVariant(QString, "2") , QVariant(QString, "3") , QVariant(QString, "4") ) )
Run Code Online (Sandbox Code Playgroud)
有没有人有什么建议?
QML 支持 QList 和 Javascript 值之间的转换,适用于有限数量的类型。有关详细信息,请参阅有关类型转换的文档。无需为这些使用 QVariant。
有了这个,从 JS 调用 C++ 方法很容易:
测试员.h:
class Tester : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void bla(const QList<QString> &strings) {
qDebug() << "Tester::bla():" << strings;
}
};
Run Code Online (Sandbox Code Playgroud)
主.cpp:
Tester tester;
viewer.engine()->rootContext()->setContextProperty("_tester", &tester);
Run Code Online (Sandbox Code Playgroud)
QML:
onClicked: _tester.bla(["asdf", "foo", "bar"]);
Run Code Online (Sandbox Code Playgroud)
请注意,我在这里没有使用信号 - 在您的情况下,信号是从 C++ 代码连接的,其中 C++ 代码从 QML 层访问了一个对象。我尽量避免这种情况,以强制在 C++ 和 QML 层之间进行更清晰的分离,这使得完全更改 QML 代码而无需调整 C++ 层成为可能。C++ 层永远不应该进入 QML 层,但反过来也可以。
将数组从 QML 传递到 C++ 的一种方法如下:
创建一个将接收该整数数组的类:
数据接收器.h
#include <QQuickItem>
#include <QList>
class Receiver : public QQuickItem
{
private:
Q_OBJECT
Q_PROPERTY (QList<int> xx READ xx WRITE setXX NOTIFY xxChanged)
QList<int> m_xx;
public:
Receiver (QQuickItem *parent = 0) {}
QList<int> xx() const
{
return m_xx;
}
public slots:
void setXX (QList<int> arg)
{
if (m_xx != arg) {
m_xx = arg;
emit xxChanged (arg);
}
}
signals:
void xxChanged (QList<int> arg);
};
Run Code Online (Sandbox Code Playgroud)
在main.cpp中
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "DataReceiver.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
const char* ui = "HELLO"; // @uri HELLO
qmlRegisterType <Receiver> (ui, 1, 0, "DataReceiver");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
在 QML 中(main.qml)
import QtQuick 2.2
import QtQuick.Window 2.1
import HELLO 1.0
Window
{
visible: true
width: 360
height: 360
id: head
property variant myArray: [1,2,3]
DataReceiver
{
id: dataReceiver
xx: head.myArray
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还想检查一下:
如何将值推送到 QML 属性变体二维数组 - 动态?