Qt DBus 没有接收到信号
Qt DBus not receiving signals
我一直在努力让 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() 中的 side-effects 是一个坏主意,应该避免,以确保代码独立于调试与发布模式执行相同的操作。 (也是检查某些东西是否在调试模式下工作但在发布模式下不工作的首要事情之一)。
我一直在努力让 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() 中的 side-effects 是一个坏主意,应该避免,以确保代码独立于调试与发布模式执行相同的操作。 (也是检查某些东西是否在调试模式下工作但在发布模式下不工作的首要事情之一)。