如何将一维整数数组从 QML 发送到 C++?

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)
  • 我如何在 QVariant 中读取这个 QVariantList,也就是说,假设我想读取数组的第一个元素,即 QVariant(QString, “2”),然后是另一个和另一个。这看起来非常复杂。
  • 我所需要的只是将一个整数数组从 QML 传递给 C++,这样我就可以读取这个数组。我不想使用 QVariant 或 QVariantList,除非我必须这样做,因为我看不到其他方法。

有没有人有什么建议?

Tho*_*ire 5

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 层,但反过来也可以。


Aqu*_*irl 3

将数组从 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 属性变体二维数组 - 动态?