0

我一直试图让 Qt DBus 工作,但没有运气。似乎我的应用程序没有收到它应该收到的信号。我已经使用 DBus 进行了监控dbus-monitor --system,它表明确实正在生成信号。当我使用 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();
}
4

1 回答 1

1

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

因此,Q_ASSERT()/assert() 中的副作用是一个坏主意,应该避免,以确保代码在独立于调试和发布模式的情况下执行相同的操作。(也是检查某些东西是否在调试模式下工作但在发布模式下工作的第一件事)。

于 2016-01-17T01:08:11.147 回答