【问题标题】:Qt DBus not receiving signalsQt DBus没有收到信号
【发布时间】:2016-04-20 15:42:45
【问题描述】:

我一直试图让 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();
}

【问题讨论】:

  • 将连接放入 assert() 是一个坏主意,因为在发布模式/禁用断言时它根本不会执行。
  • @FrankOsterfeld 我不知道!我只是盲目地复制教程并假设 Q_ASSERT 总是运行。事实证明,由于其他原因,我在发布模式下运行我的程序,所以这是罪魁祸首。如果您将评论扩展为正式答案,我很乐意接受。

标签: c++ qt dbus qtdbus


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 2016-09-16
    • 2011-01-08
    • 2017-08-01
    • 2015-07-23
    • 2017-09-24
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多