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

Posted

技术标签:

【中文标题】如何将一维整数数组从 QML 发送到 C++?【英文标题】:How to send a 1 dimensional integer array from QML to C++? 【发布时间】:2014-12-15 17:24:48 【问题描述】:

所以我有一个信号:

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,除非我必须这样做,因为我看不到其他方法。

有人有什么建议吗?

【问题讨论】:

【参考方案1】:

QML 支持 QList 和 javascript 值之间的转换,用于有限数量的类型。有关详细信息,请参阅documentation on type conversion。这些不需要使用 QVariant。

这样,从 JS 调用 C++ 方法就很简单了:

tester.h:

class Tester : public QObject

    Q_OBJECT
public:
    Q_INVOKABLE void bla(const QList<QString> &strings) 
        qDebug() << "Tester::bla():" << strings;
    
;

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

【讨论】:

在 tester.cpp 我想实现一个大的让我们说 bla() 方法,它的语法是什么?是:void tester::bla(const QList&lt;QString&gt; &amp;strings) ........ 吗? 我是否正确理解您想要将bla() 的实现从.h 文件中的类内移动到.cpp 文件中的类外?那确实是 .cpp 文件中的void Tester::bla(const QList&lt;QString&gt; &amp;strings) ... 【参考方案2】:

将数组从 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);
;

在 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();

在 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
     

您可能还想查看这个:How to push values to QML property variant two dimensional array - dynamically?

【讨论】:

是的,使用属性甚至比 Q_INVOKABLE 方法更好,因为属性绑定比命令式调用某些方法更具声明性。 为了清楚使用什么,我再问你一个问题:我还有一个带有很多按钮和其他控件的 QML。单击按钮后,我想将我在 QML 中单击的按钮的 objectName 发送到 C++。然后 C++ 应该调用一个方法,该方法检查 buttonClicked 的 objectName 然后做一些事情。您已经很好地描述了如何将数组从 QML 发送到 C++。我想知道是否有类似的东西可以发送 objectName onButtonClicked。现在我正在为所有事情使用信号和插槽。它效果很好,但这是我的论文,我想要最好的。 @mshefiti 无需在任何地方发送任何对象名称。您可以简单地为每个按钮声明一个唯一 ID,然后将该 ID 发送到您想要的任何位置。 谢谢你的回答,它很有帮助@TheIndependentAquarius 谢谢@tmcguire,我也试过Q_Invokable,它工作得很好,但就我而言,使用属性绑定更有意义。

以上是关于如何将一维整数数组从 QML 发送到 C++?的主要内容,如果未能解决你的问题,请参考以下文章

将对象从 c++ 发送到 qml。空闲内存呢?

如何将信号从一个 qml 发送到另一个

从 C++ (Qt5) 向 QML 项目发送信号

用于将数组/向量发送到 C++ 脚本的 Cython 示例

c++学到一维数组了怎么在cout里保留两位小数?

将二进制数据从 QML 传递到 C++