在 catch-all 回调中识别来自 QDBusPendingCallWatcher 的原始调用
Identify original call from QDBusPendingCallWatcher in catch-all callback
我想使用 Qt 的 QDBusPendingCallWatcher
来跟踪一些 D-Bus 调用的响应。我可以进行几种不同的 D-Bus 调用,但我想对所有这些调用进行一次回调。
问题是当 return 值就绪时 QDBusPendingCallWatcher
发出的 finished
信号只有一个指向 QDBusPendingCallWatcher
本身的指针,我没有发现获取原始 QDBusMessage
的方法(其中包含被调用的方法)。
深入研究 Qt 的源代码,您可以看到调用 asyncCall
会创建 QDBusMessage
,而 QDBusMessage
又会传递给正在使用的 QDBusConnection
,但遗憾的是,信息已存储在 QDBusPendingCallPrivate
中使用 pimpl 模式,似乎无法从客户端代码中恢复。
TL;DR:是否有可能从 QDBusPendingCallWatcher::finished
信号触发的槽中知道异步 D-Bus 调用的方法名称?
如您所知,似乎无法取回原始消息。但是,我至少可以看到两个解决方法。由于 QDbusPendingCallWatcher
继承自 QObject
,您可以在观察器上设置一个 属性 来保留方法调用的名称。或者,您可以使用 lambda 函数向回调添加更多信息(例如方法名称)。
DBusCaller::DBusCaller(QObject *parent) : QObject(parent)
{
QDBusInterface connSettings("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings/1",
"org.freedesktop.NetworkManager.Settings.Connection",
QDBusConnection::systemBus() );
//Method 1: set a property on the object
{
QDBusPendingCall pending = connSettings.asyncCall( "GetSettings" );
QDBusPendingCallWatcher* watch = new QDBusPendingCallWatcher( pending );
watch->setProperty( "method", "GetSettings" );
connect( watch, &QDBusPendingCallWatcher::finished,
this, &DBusCaller::callFinished );
}
//Method 2: use a lambda to add more information to our callback
{
QString methodName = "GetSettings";
QDBusPendingCall pending = connSettings.asyncCall( methodName );
QDBusPendingCallWatcher* watch = new QDBusPendingCallWatcher( pending );
connect( watch, &QDBusPendingCallWatcher::finished,
this, [=](QDBusPendingCallWatcher* reply) { callFinishedString( methodName, reply ); });
}
}
void DBusCaller::callFinished(QDBusPendingCallWatcher* pending){
pending->deleteLater();
qDebug() << "Pending finished. Method: " << pending->property( "method" );
}
void DBusCaller::callFinishedString(QString methodName,
QDBusPendingCallWatcher *watch){
watch->deleteLater();
qDebug() << "Pending finsihed. Method: " << methodName;
}
我想使用 Qt 的 QDBusPendingCallWatcher
来跟踪一些 D-Bus 调用的响应。我可以进行几种不同的 D-Bus 调用,但我想对所有这些调用进行一次回调。
问题是当 return 值就绪时 QDBusPendingCallWatcher
发出的 finished
信号只有一个指向 QDBusPendingCallWatcher
本身的指针,我没有发现获取原始 QDBusMessage
的方法(其中包含被调用的方法)。
深入研究 Qt 的源代码,您可以看到调用 asyncCall
会创建 QDBusMessage
,而 QDBusMessage
又会传递给正在使用的 QDBusConnection
,但遗憾的是,信息已存储在 QDBusPendingCallPrivate
中使用 pimpl 模式,似乎无法从客户端代码中恢复。
TL;DR:是否有可能从 QDBusPendingCallWatcher::finished
信号触发的槽中知道异步 D-Bus 调用的方法名称?
如您所知,似乎无法取回原始消息。但是,我至少可以看到两个解决方法。由于 QDbusPendingCallWatcher
继承自 QObject
,您可以在观察器上设置一个 属性 来保留方法调用的名称。或者,您可以使用 lambda 函数向回调添加更多信息(例如方法名称)。
DBusCaller::DBusCaller(QObject *parent) : QObject(parent)
{
QDBusInterface connSettings("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings/1",
"org.freedesktop.NetworkManager.Settings.Connection",
QDBusConnection::systemBus() );
//Method 1: set a property on the object
{
QDBusPendingCall pending = connSettings.asyncCall( "GetSettings" );
QDBusPendingCallWatcher* watch = new QDBusPendingCallWatcher( pending );
watch->setProperty( "method", "GetSettings" );
connect( watch, &QDBusPendingCallWatcher::finished,
this, &DBusCaller::callFinished );
}
//Method 2: use a lambda to add more information to our callback
{
QString methodName = "GetSettings";
QDBusPendingCall pending = connSettings.asyncCall( methodName );
QDBusPendingCallWatcher* watch = new QDBusPendingCallWatcher( pending );
connect( watch, &QDBusPendingCallWatcher::finished,
this, [=](QDBusPendingCallWatcher* reply) { callFinishedString( methodName, reply ); });
}
}
void DBusCaller::callFinished(QDBusPendingCallWatcher* pending){
pending->deleteLater();
qDebug() << "Pending finished. Method: " << pending->property( "method" );
}
void DBusCaller::callFinishedString(QString methodName,
QDBusPendingCallWatcher *watch){
watch->deleteLater();
qDebug() << "Pending finsihed. Method: " << methodName;
}