Qt DBus没有收到信号

时间:2016-01-15 04:28:29

标签: c++ qt dbus qtdbus

我一直在努力让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();
}

1 个答案:

答案 0 :(得分:1)

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

因此,Q_ASSERT()/ assert()中的副作用是一个坏主意,应该避免,以确保代码执行相同的独立于调试与释放模式。 (也是首先要检查某些东西是否在调试模式下工作而不是在发布模式下)。