【发布时间】: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 总是运行。事实证明,由于其他原因,我在发布模式下运行我的程序,所以这是罪魁祸首。如果您将评论扩展为正式答案,我很乐意接受。