2016-01-15 5 views
0

Я пытался заставить 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(); 
} 
+0

Установка соединения в assert() - это плохая идея, потому что она не будет выполняться вообще, а затем в режиме деблокирования/когда утверждения отключены. –

+0

@FrankOsterfeld Я этого не знал! Я просто слепо копировал учебник и предполагал, что Q_ASSERT всегда работает. Как оказалось, я запускал свою программу в режиме Release по другим причинам, так что это был преступник. Если вы добавите свой комментарий в официальный ответ, я с удовольствием его принимаю. –

ответ

1

Проблема здесь состоит в том, что код в Q_ASSERT() (или утверждать()) ISN» t запускается, когда код создается в режиме деблокирования. Это означает, что ваши вызовы connect() никогда не выполняются в режиме деблокирования.

Таким образом, побочные эффекты внутри Q_ASSERT()/assert() являются плохими идеями, и их следует избегать, чтобы гарантировать, что код делает то же самое независимо от режима отладки или выпуска. (также одна из первых вещей, чтобы проверить, работает ли что-то в режиме отладки, но не в режиме выпуска).