c++ - Qt DBus连接不适用于SLOT参数中的typedef

标签 c++ qt typedef dbus qdbus

我可以使用 QDBusConnection::connect 和旧式 SLOT 语法将DBus信号连接到Qt插槽:

#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"

如果我为插槽使用connect参数,则QMap<QString, QVariant>调用成功,并且接收到DBus信号。如果我使用PropertyDictionary typedef,它将失败。

我知道C++,但是我对moc魔术并不熟悉,所以希望对您有所帮助。

我正在使用Ubuntu repo的Ubuntu 18.04,Qt 5.9.5进行构建,使用
/usr/lib/qt5/bin/moc  -I /usr/include/x86_64-linux-gnu/qt5 -I /usr/include/x86_64-linux-gnu/qt5/QtCore -I /usr/include/x86_64-linux-gnu/qt5/QtDBus -I /usr/include/x86_64-linux-gnu/qt5/QtNetwork  -i DBusTimezoneApp.cxx -o DBusTimezoneApp.moc
g++ -Wall -Wextra -Wconversion -Werror -pedantic -I /usr/include/x86_64-linux-gnu/qt5 -I /usr/include/x86_64-linux-gnu/qt5/QtCore -I /usr/include/x86_64-linux-gnu/qt5/QtDBus -I /usr/include/x86_64-linux-gnu/qt5/QtNetwork   -std=c++17 -fPIC -O0 -g3 -c DBusTimezoneApp.cxx
g++ -o DBusTimezoneApp DBusTimezoneApp.o -l Qt5Core -l Qt5DBus -l Qt5Network

最佳答案

您必须使用 qRegisterMetaType 注册PropertyDictionary:

// ...
qDBusRegisterMetaType<PropertyDictionary>();
qRegisterMetaType<PropertyDictionary>("PropertyDictionary");
// ...

关于c++ - Qt DBus连接不适用于SLOT参数中的typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517581/

相关文章:

C++/Arduino 理解 uint8_t 和 * 的用法

c++ - 只有一列适合其内容大小,而其他列则拉伸(stretch)

C 项目 - 两个库对不同类型使用相同的 typedef 标识符

我的 std::map of &Objects 和 std::vector of &Objects 导致 C++ 内存泄漏

c++ - 在 Mingw32 中编译 SystemC 库

c++ - 如何在 cpp 中使用 std::regex_replace() 函数查找和替换

QtCreator语义问题警告代码永远不会被执行

c++ - 在 QRubberband 上实现调整大小的句柄? QSizeGrip 相关吗?

c++ - typedef 类型名和从属范围

c++ - 如何在包含 typedef 的情况下使用从右到左的规则解释变量声明?