将信号从QML连接到Qt:var到QList <qstring>

时间:2018-01-24 15:53:01

标签: qt qml signals-slots

我正在尝试将来自QML的信号连接到Qt的SLOT。信号传递QList变量。

QML:

property var cases: ["A", "B", "C"]

signal casesClicked(list cases)

Qt的:

d->m_view->setSource(QUrl("qrc:/qml/main.qml"));
d->m_item = d->m_view->rootObject();
QObject::connect(d->m_item, SIGNAL(casesClicked(QList<QString>)), this, SLOT(onCasesClicked(QList<QString>)));

我遇到的问题是我不知道如何从QML端声明QList,因此直接采用。如果我用:

声明它
signal casesClicked(var cases)

然后,信号未连接,如果我将其声明为列表或数组,则表示"Invalid signal parameter type: list/Array"

任何提示?我对单个int,bool或string没有任何问题。谢谢,

2 个答案:

答案 0 :(得分:1)

我不认为在C ++端进行连接是不合适的,因为在编译它时不知道在QML中创建的信号,可能的解决方案是在QML端建立连接。在下面我展示了一个例子

<强>的main.cpp

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>
#include <QDebug>
class Test: public QObject{
QQuickView *view;
Q_OBJECT
public:
    Test(QObject *parent=Q_NULLPTR):QObject(parent)
    {
        view = new QQuickView;
        view->rootContext()->setContextProperty("Test", this);
        view->setSource(QUrl("qrc:/main.qml"));
        view->show();
    }
public slots:
    void onCasesClicked(QVariantList cases){
        qDebug()<<cases;
    }
};

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);
    Test test;
    return app.exec();
}

#include "main.moc"

<强> main.qml

import QtQuick 2.9

Item {
    id: it
    visible: true
    width: 640
    height: 480

    signal casesClicked(var cases)

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        onClicked: it.casesClicked(["B", 1, "D"])
    }

    Connections{
        target: it
        onCasesClicked: Test.onCasesClicked(cases)
    }
    // or
    // onCasesClicked: Test.onCasesClicked(cases)
    // if the connection is made in the same item
}

输出:

(QVariant(QString, "B"), QVariant(int, 1), QVariant(QString, "D"))

答案 1 :(得分:0)

IIRC JS数组在C ++中转换为QVariantList,所以请尝试使用它。

编辑:

好的,看来虽然以上是默认的自动转换,但是当用C ++建立连接时它不能用于某种原因。

在这种情况下,信号值转换为QVariant,可以直接转换为方便的QStringList。但是,如果你有一个包含不同数据类型的JS数组,那么这种方法将不起作用,这是完全合法的并且在JS中经常使用。

如果将JS数组作为参数传递给C ++函数调用,

QVariantList仍然有效。因此,您可以迭代每个值并处理“多态”数组。

是否建议练习从C ++创建QML对象的连接取决于使用场景,总的来说,我会说它不是。建议的做法是将C ++核心接口暴露给QML并从那里进行连接,并避免从C ++接触任何QML。但是有一些极端情况可以例外。