Qt DBus未接收信号

Qt DBus not receiving signals

本文关键字:信号 DBus Qt      更新时间:2023-10-16

我一直在努力让Qt DBus工作,但没有运气。 似乎我的应用程序没有收到应有的信号。 我使用 dbus-monitor --system 监控了 DBus,它表明信号确实正在生成。 当我使用 Qt 进行方法 DBus 方法调用时,响应返回得很好。 即使在QDBUS_DEBUG=1的情况下运行,也不会打印任何内容显示Qt接收到信号。 我错过了一些明显的东西吗?

以下是应该可以工作但不能工作的代码(没有任何东西打印到控制台):

class Example1 : public QObject
{
    Q_OBJECT
public:
    Example1(QObject* parent = NULL) : QObject(parent)
    {
    }
    void setupDBus()
    {
        // Get the system bus
        QDBusConnection dBusSystem = QDBusConnection::systemBus();
        // check if it is connected
        if (!dBusSystem.isConnected())
        {
            qFatal("Cannot connect to the D-Bus session bus.");
            return;
        }
        // register "device added"
        Q_ASSERT(dBusSystem.connect("org.freedesktop.UDisks",
                                "/org/freedesktop/UDisks",
                                "org.freedesktop.UDisks",
                                "DeviceAdded",
                                this,
                                SLOT(deviceAdded(const QDBusObjectPath&))));
        // register "device removed"
        Q_ASSERT(dBusSystem.connect("org.freedesktop.UDisks",
                                "/org/freedesktop/UDisks",
                                "org.freedesktop.UDisks",
                                "DeviceRemoved",
                                this,
                                SLOT(deviceRemoved(const QDBusObjectPath&))));
    }
private slots:
    // slot for "device added"
    void deviceAdded(const QDBusObjectPath &in)
    {
        qDebug() << "device added: "; //<< in.path();
    }
    // slot for "device removed"
    void deviceRemoved(const QDBusObjectPath &in)
    {
        qDebug() << "device removed: "; //<< in.path();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Example1 example;
    example.setupDBus();
    return a.exec();
}

这里的问题是,当代码以发布模式构建时,Q_ASSERT()(或 assert())中的代码不会运行。这意味着您的 connect() 调用永远不会在发布模式下执行。

因此,Q_ASSERT()/assert() 内部的副作用是一个坏主意,应该避免,以确保代码独立于调试模式和发布模式做同样的事情。(也是检查某些内容在调试模式下是否有效但在发布模式下不起作用的第一件事)。