如何将2维浮点数组从QML传递给C ++?

时间:2014-09-26 09:52:50

标签: arrays qt qml qtquick2

我在QML中有一个二维浮点数组。如何在C ++中获取其值。

我用c ++创建了一个类,并完成了qmlRegisterType的一部分。现在可以在QML中访问该类。

请用一个小例子来证明。


以下是我的尝试:

标题

#include <QQuickItem>
#include <iostream>

class Controller : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QList <QVariantList> names READ names WRITE setnames NOTIFY namesChanged)
    QList <QVariantList> m_names;

public:
    Controller()
    {
    }
    ~Controller() {
    }

    QList <QVariantList> names() const
    {
        return m_names;
    }

public slots:
    void setnames(QList <QVariantList> arg)
    {
        QVariantList p;
        if (arg.size () > 0)
        {
            p = arg.first ();
            std::cout << "\narg: \n" << p[0].toInt ();
        }
        else
            std::cout << "\nqqqq " << arg.size () << "\n";
    }

signals:
    void namesChanged(QList <QVariantList> arg);
};

QML

import QtQuick 2.0
import FromCpp 1.0

Rectangle
{
    property variant arras: [[1,2,3], [4,5,6]]
    Controller
    {
        id: ppp
    }

    MouseArea
    {
        anchors.fill: parent
        onClicked:
        {
            ppp.setnames(arras)
            console.log(arras.length)
        }
    }
}

来自QtCreator的确切输出:

Starting /home/***/documents/test/build-junk-Desktop_Qt_5_1_0_GCC_64bit-Debug/junk...
QML debugging is enabled. Only use this in a safe environment.
2

qqqq 0
QThreadStorage: Thread 0x181e270 exited after QThreadStorage 2 destroyed
/home/***/documents/test/build-junk-Desktop_Qt_5_1_0_GCC_64bit-Debug/junk exited with code 0

///

在这里,您可以看到QML中2D阵列的大小正确打印为2,大小从c ++打印为0。

为什么会这样?请解释一下。

5 个答案:

答案 0 :(得分:4)

根据user1095108's answer,为了访问传递给C ++的QML 2 Dim数组的内部元素,我们需要将每一行转换为一个列表,如下所示:

QML部分:

import QtQuick 2.0
import FromCpp 1.0

Rectangle
{
    property variant twoDimArray: [[1,2,3], [4,5,6]]
    Controller
    {
        id: controllerA
    }

    MouseArea
    {
        anchors.fill: parent
        onClicked:
        {
            controllerA.setname (twoDimArray)
        }
    }
}

C ++部分:

void setname (QVariantList arg)  
{  
    if (arg.size())
    {
        QList <QVariant> p = arg[0].toList();

        std::cout << "\nRow0 0:" << p[0].toInt ();
        std::cout << "\nRow0 1:" << p[1].toInt ();
        std::cout << "\nRow0 2:" << p[2].toInt ();

        std::cout << "\n";

        QList <QVariant> p1 = arg[1].toList();

        std::cout << "\nRow1 0:" << p1[0].toInt ();
        std::cout << "\nRow1 1:" << p1[1].toInt ();
        std::cout << "\nRow1 2:" << p1[2].toInt ();
    }
}

<强>输出:

Starting /home/.../documents/test/build-junk-Desktop_Qt_5_1_0_GCC_64bit-Debug/junk...
QML debugging is enabled. Only use this in a safe environment.

Row0 0:1
Row0 1:2
Row0 2:3

Row1 0:4
Row1 1:5
Row1 2:6/home/.../documents/test/build-junk-Desktop_Qt_5_1_0_GCC_64bit-Debug/junk exited with code 0

答案 1 :(得分:3)

实际上非常简单。 Javascript数组映射到QVariantList s,Javascript对象映射到QVariantMap。因此,您正在处理嵌套的QVariantList。试试这个:

void setnames(QVariantList const& arg)
    {
        if (arg.size())
        {
            auto const p(arg.front().toList());
            std::cout << "\narg: \n" << p.front().toInt();
        }
        else
            std::cout << "\nqqqq " << arg.size () << "\n";
    }

答案 2 :(得分:1)

这是我的方法:

#include <QQuickItem>
#include <QDebug>

#include <QVariantList>

class Controller : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QVariant names READ names WRITE setnames NOTIFY namesChanged)
    QVariant m_names;

public:
    Controller()
    {
    }
    ~Controller() {
    }

    QVariant names() const
    {
        return m_names;
    }

public slots:
    void setnames(QVariant arg)
    {
        QVariantList dim1 = arg.toList();
        qDebug() << "outer dimension size" <<  dim1.size();
        for(int i=0;i<dim1.size();++i)
        {
            QVariantList &dim2 = dim1.at(i).toList();
            qDebug() << "inner dimension size at" << dim2.size();
        }
    }

signals:
    void namesChanged();
};

答案 3 :(得分:0)

试试这个:

QML文件中的某个地方:

property variant floats: [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]

包括:

#include <QtQuick/QQuickView>
#include <QQmlContext>
#include <QQmlProperty>
#include <QQuickItem>

在C ++中,在构造函数中,例如:

QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, ui->widget);//I show view in my widget
container->setMinimumSize(ui->widget->size());
container->setMaximumSize(ui->widget->size());
view->setSource(QUrl::fromLocalFile("pathToQMLFile"));

//starts here
QQmlProperty property(view->rootObject(), "floats");//get rootObject and set name of property
QVariantList lst = property.read().toList();//use raed method to get QVariant and convert it to list

for (int i = 0; i < lst.length(); ++i)
{
    qDebug() << lst.at(i).toFloat();//show list
}

输出:

1.1 
2.2 
3.3 
4.4 
5.5 
6.6 

我希望我的代码显示主要想法,你可以在课堂上使用它,因为最重要的工作(如何获得数字)已经完成。

答案 4 :(得分:0)

看起来您可以使用QVariantList(或QList<QVariant>):

#include <QtQuick>

class Controller : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QVariantList names READ names WRITE setnames NOTIFY namesChanged)
    QVariantList m_names;

public:
    Controller()
    {
    }
    ~Controller() {
    }

    QVariantList names() const
    {
        return m_names;
    }

public slots:
    void setnames(QVariantList arg)
    {
        qDebug() << arg;
    }

signals:
    void namesChanged(QVariantList arg);
};

#include <QApplication>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    qmlRegisterType<Controller>("FromCpp", 1, 0, "Controller");

    QQuickView view(QUrl(QStringLiteral("main.qml")));
    view.show();

    return app.exec();
}

#include "main.moc"

输出:

(QVariant(QVariantList, (QVariant(int, 1) ,  QVariant(int, 2) ,  QVariant(int, 3) ) ) ,  QVariant(QVariantList, (QVariant(int, 4) ,  QVariant(int, 5) ,  QVariant(int, 6) ) ) )