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

How to send a 1 dimensional integer array from QML to C++?

本文关键字:QML C++ 数组 一维 整数      更新时间:2023-10-16

所以我有一个信号:

QML:

signal qmlSendWorkflowIdsArraySignal(variant workflowIdsArray)

.JS:

sendToCppWorkflowIdsArray(arrayOfWorkflowIds);

C++:

QObject::connect(qmlMainContentItemObject, SIGNAL(qmlSendWorkflowIdsArraySignal(QVariant)), &myController, SLOT(qmlToCppWorkflowIdsArraySlot(QVariant)));

C++插槽:

void qmlToCppWorkflowIdsArraySlot(QVariant workflowIdsArray)
{
  qDebug() << " +++++++++++++++ Cpp Array slot has been called: "<<workflowIdsArray;
}

输出:

+++++++++++++++ Cpp Array slot has been called:
QVariant(QVariantList, (QVariant(QString, "2") ,  QVariant(QString, "3") ,  QVariant(QString, "4") ) )
  • 我如何在 QVariant 中阅读这个 QVariantList,即,假设我想要读取数组的第一个元素,即 QVariant(QString,"2"),然后是另一个和另一个。这看起来很复杂,就像这。
  • 我所需要的只是将整数数组从 QML 传递到 C++,所以我可以读取此数组。我不想使用 QVariant 或 QVariantList,除非我必须这样做,因为我认为没有其他方法可以做到这一点。

有人有什么建议吗?

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;
    }
};

主.cpp:

Tester tester;
viewer.engine()->rootContext()->setContextProperty("_tester", &tester);

QML:

onClicked: _tester.bla(["asdf", "foo", "bar"]);

请注意,我在这里没有使用信号 - 在您的情况下,信号是从C++代码连接的,其中C++代码从 QML 层访问对象。我尽量避免这种情况,强制C++层和QML层之间更清晰的分离,这使得完全更改QML代码而无需适应C++层成为可能。C++层永远不应该到达QML层,反之亦然。

将数组从 QML 传递到 C++ 的一种方法如下:

创建一个将接收该整数数组的类:

DataReceiver.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);
};

主要.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();
}

In 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
    } 
}

您可能还想检查一下:
如何将值推送到 QML 属性变体二维数组 - 动态?