我在c ++代码中实现了qml函数的回调。让我解释一下我想要什么,什么时候一切都会奏效(我会相信;)。
我有两面: 一方面 - 带有gui的cml项目和带有dbus接口的c ++插件。
另一方面 - 只是处理dbus消息和回答的事情。
我想在qml代码中调用一些函数:
Component.onCompleted: {
A.request1( function(arg) {console.log('Callback func invoked - ', arg)} )
在c ++插件中我这样做:
class A () {
public:
request1(QJSValue callback_func) {
QList<QVariant> args;
QDBusPendingCall pcall = interface->asyncCallWithArgumentList(QString("GetMachineId"), args);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);
QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SLOT(response1(QDBusPendingCallWatcher*)));
qjs_value = callback_func;
}
public slots:
void response1(QDBusPendingCallWatcher* w) {
cout << "Debug message1";
qjs_value.call(QJSValueList() << 'Some text');
}
private:
QJSValue qjs_value;
}
Dbus发送消息,接收应答,观察者捕获回复,发起SIGNAL,连接到SLOT&#34; response1&#34;。 我看到调试消息&#34;调试消息1&#34;,所以我认为&#34; response1()&#34;函数被正确调用。但那,在下一行
qjs_value.call(QJSValueList() << 'Some text');
我得到了一个段错误,我无法理解它的原因。
还有一件事:如果我在request1()函数中调用回调qjs_value.call - 它可以正常工作,我看到&#34;调用了回调函数 - 一些文本&#34;。但它并没有按照我描述的方式发挥作用。
你有什么想法吗?
答案 0 :(得分:0)
也许在GUI线程中没有执行response1插槽?只是尝试将其连接为&#34;排队&#34;连接?