c++ - 将信号从 QML 连接到 Qt : var to QList<QString>

标签 c++ qt qml qt5 qt-signals

我正在尝试将 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)

然后,信号未连接,如果我将其声明为列表或数组,它会显示“无效信号参数类型:列表/数组”

有什么建议吗?我对单个 int、bool 或 string 没有任何问题。谢谢,

最佳答案

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

ma​​in.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"

ma​​in.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"))

关于c++ - 将信号从 QML 连接到 Qt : var to QList<QString>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426521/

相关文章:

android - 如何改变音调?

c++ - 使用 Boost 在 C++ 中并发

c++ - 如何使用文本文件中的内容填充 Qt ListView?

qml - QML中的图像圆角

c++ - TBB task_arena 和 task_group 用于扩展 parallel_for 工作

c++ - 如何确定浮点值中小数点后的位数?

c++ - Qt中如何子类化?

c++ - QTableWidget 在内容和拉伸(stretch)上调整列的大小

c++ - 如何将鼠标/光标添加到非触摸手机的 QML 应用程序?

C++ 信号不会在 QML 端被捕获