一个QML信号连接到一个普通的C++插槽很简单:连接QML信号C++ 11拉姆达插槽(QT 5)
// QML
Rectangle { signal foo(); }
// C++ old-style
QObject::connect(some_qml_container, SIGNAL(foo()), some_qobject, SLOT(fooSlot()); // works!
但是,不管我怎么努力,我似乎无法能够连接到C++ 11 lambda功能插槽。
// C++11
QObject::connect(some_qml_container, SIGNAL(foo()), [=]() { /* response */ }); // fails...
QObject::connect(some_qml_container, "foo()", [=]() { /* response */ }); // fails...
这两次尝试都失败并出现函数签名错误(没有QObject :: connect overload可以接受这些参数)。但是,Qt 5文档意味着这应该是可能的。
不幸的是,Qt的5例的C++信号总是连接到C++拉姆达槽:
// C++11
QObject::connect(some_qml_container, &QMLContainer::foo, [=]() { /* response */ }); // works!
此语法不能为QML信号工作,因为QMLContainer :: foo的签名不是在编译时已知(并且手动声明QMLContainer :: foo会首先破坏使用QML的目的。)
正在尝试做什么?如果是这样,QObject :: connect调用的正确语法是什么?
感谢您的回答,这给了我一个新的方向来寻找答案:是否有可能获得C++指针到QML信号?如果是这样,我可以将一个std ::函数绑定到该信号,并将一个lambda绑定到该插槽。 不幸的是,将每个QML信号镜像到一个C++ QObject中(可以说)是一种比定义QObject中的插槽更糟糕的设计(即旧式的方法)。我想要做的就是完全避免使用QObject,并利用新的Qt 5接口(可能或不可能)。 – 2013-03-26 08:49:46
那么,自动发生信号 - 信号连接可能意味着它只是一个额外的代码行,类似于在声明QML查看器之后的这一行:'MyQMLSignalRouter qmlSignals(&myQmlView.rootObject());'然后在新中使用'qmlSignals'式连接调用。 QML信号并不作为C++函数存在,它们不能(它们是动态的,C++是静态的),所以直接指向它们的方法指针在理论上是不可能的,据我所知。 – hyde 2013-03-26 09:04:18
我对此方法的怀疑在于它引入的QML信号与C++代码之间的紧密耦合,以及单一的“超类”方法(一个类声明所有信号,无处不在)。真难闻! 你是完全正确的,QML信号静态不可用于C++。然而,动态解决方案可能存在: QQuickItem :: metaObject() - > indexOfSignal(“foo()”) 正确返回该信号的索引。 AFAICT,用于获取可调用封装的管道也存在,但隐藏在QtPrivate命名空间中。游民。 – 2013-03-26 10:07:17