Я пытался заставить Qt DBus работать, но не повезло. Похоже, что мое приложение не получает сигналы, которые ему нужны. Я контролировал DBus, используя dbus-monitor --system
, и он показывает, что сигналы действительно генерируются. Когда я делаю метод DBus методом вызова с Qt, ответ возвращается просто отлично. Даже при работе с QDBUS_DEBUG = 1 ничего не печатается, показывая, что Qt получил сигналы. Мне что-то не хватает?Qt DBus не принимает сигналы
Вот код, который должен работать, но не (не печатает на консоли):
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 всегда работает. Как оказалось, я запускал свою программу в режиме Release по другим причинам, так что это был преступник. Если вы добавите свой комментарий в официальный ответ, я с удовольствием его принимаю. –