問題の概要:qdbusxml2cpp
は方法D-Busは非同期返信フェッチQDBusAbstractInterface
サブクラスを生成し、私は(応答が受信されるまで、すなわち、それはブロックする)、それは、同期したいです。qdbusxml2cppで同期インタフェースクラスを生成する方法は?
XML入力:このコマンドヘッダ(図示せず).cppファイルで
<?xml version="1.0"?>
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="some.interface.Foo">
<method name="GetValues">
<arg name="values" type="a(oa{sv})" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList<SomeStruct>" />
</method>
</interface>
</node>
が生成される:
qdbusxml2cpp-qt5 -c InterfaceFoo -p interface_foo foo.xml
生成ヘッダ:あなたと
class InterfaceFoo: public QDBusAbstractInterface
{
Q_OBJECT
public:
static inline const char *staticInterfaceName()
{ return "some.interface.Foo"; }
public:
InterfaceFoo(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);
~InterfaceFoo();
public Q_SLOTS: // METHODS
inline QDBusPendingReply<QList<SomeStruct> > GetValues()
{
QList<QVariant> argumentList;
// NOTICE THIS LINE.
return asyncCallWithArgumentList(QStringLiteral("GetValues"), argumentList);
}
Q_SIGNALS: // SIGNALS
};
namespace some {
namespace interface {
typedef ::InterfaceFoo Foo;
}
}
#endif
生成されたメソッドを見ることができますasyncCallWithArgumentList()
は非同期です:それはconnect()
Dバス応答が到着したときにトリガーされるスロットに接続される。
代わりに私が行うことができるようにしたい:
some::interface::Foo *interface = new some::interface::Foo("some::interface", "/Foo", QDBusConnection::systemBus(), this);
// THIS SHOULD block until a reply is received or it times out.
QList<SomeStruct> data = interface->GetValues();
あなたが探している解決策ではありませんが、返信が到着するまで 'interface-> GetValues()。value()'を呼び出すことができます –