我可以使用QDBusConnection::connect
和旧式QDBusConnection::connect
语法将DBus信号连接到Qt插槽:
SLOT
SLOT
调用成功,并且如果我为插槽使用#pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
# include <QCoreApplication>
# include <QDBusConnection>
# include <QDBusMetaType>
# include <QDebug>
# include <QMap>
# include <QString>
# include <QVariant>
#pragma GCC diagnostic pop
using PropertyDictionary = QMap<QString, QVariant>;
Q_DECLARE_METATYPE(PropertyDictionary)
class MyLogger : public QObject
{
Q_OBJECT
public slots:
void log(QString const& interface, QMap<QString, QVariant> const& properties)
{
logTypedef(interface, properties);
}
void logTypedef(QString const& interface, PropertyDictionary const& properties)
{
qDebug() << "interface = " << interface;
qDebug() << "properties = " << properties;
}
};
int main(int argc, char* argv[])
{
qDBusRegisterMetaType<PropertyDictionary>();
QCoreApplication app{argc, argv};
MyLogger logger{};
auto const connected
{
QDBusConnection::systemBus().connect
(
"org.freedesktop.timedate1",
"/org/freedesktop/timedate1",
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
&logger,
// SLOT(log(QString, QMap<QString, QVariant>)) // works
SLOT(logTypedef(QString, PropertyDictionary)) // assert fails
)
};
Q_ASSERT(connected);
return app.exec();
}
#include "DBusTimezoneApp.moc"
参数,则会接收到DBus信号。如果使用connect
typedef,它将失败。
我知道C ++,但是我对QMap<QString, QVariant>
魔术并不熟悉,因此希望对您有所帮助。
我正在使用Ubuntu存储库中的Ubuntu 18.04,Qt 5.9.5进行构建,使用>]
PropertyDictionary
我可以使用QDBusConnection :: connect和旧式SLOT语法将DBus信号连接到Qt插槽:#pragma GCC诊断推送#pragma GCC诊断已忽略“ -Wconversion”#include <...>
moc
注册PropertyDictionary: