QObject :: connect: не удается подключиться (null) - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь загрузить плагины.Если они загружены успешно, то я должен подключить возвращенные виджеты.

С помощью одного плагина я создаю действие и добавляю его в меню, с помощью другого плагина я создаю метку и добавляю его в окно.Даже если я получаю эту ошибку во время выполнения (когда приложение загружает плагины), эти два виджета создаются и видны.Но между ними нет никакой связи.

Вот как я пытаюсь подключить виджеты

QObject *plugin = pluginLoader.instance();
if (plugin) {
    myAction = qobject_cast<ActionInterface *>(plugin);

    if (myAction) {
        pluginMenu->addAction(myAction->newAction());
        verify ++;
    }

    myLabel = qobject_cast<LabelInterface *>(plugin);

    if (myLabel) {            
        layout->addWidget(myLabel->newLabel());
        verify++;
    }

    if (verify == 2)
        connect(myAction, SIGNAL(pushMyAction()),
            myLabel, SLOT(setTextforLabel()));
    }

    ...
}

Сообщение об ошибке:

QObject :: connect: Невозможно подключиться (null) :: pushMyAction () в LabelPlugin :: setTextforLabel ()

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

У вас есть два разных плагина.Очевидно, что один может быть приведен к ActionInterface, но не к LabelInterface, а другой может быть приведен к LabelInterface, но не к ActionInterface.

.загрузите оба плагина (и количество проверок 2), тогда можно безопасно соединиться между этими плагинами.Однако вы, похоже, пытаетесь использовать второй загруженный плагин, который будет служить и сигналом и слотом.Это потому, что каждый раз, когда вы запускаете код, вы перезаписываете и myAction, и myLabel.Итак, как минимум:

QObject* plugin = pluginLoader.instance();
if (plugin) {
    ActionInterface* myActionTemp = qobject_cast<ActionInterface*>(plugin);

    if (myActionTemp) {
        myAction = myActionTemp;
        pluginMenu->addAction(myAction->newAction());
        verify++;
    }

    LabelInterface* myLabelTemp = qobject_cast<LabelInterface*>(plugin);

    if (myLabelTemp) {
        myLabel = myLabelTemp;            
        layout->addWidget(myLabel->newLabel());
        verify++;
    }

    /* if (myAction and myLabel) would be less convoluted... */
    if (verify == 2) { 
        connect(myAction, SIGNAL(pushMyAction()),
            myLabel, SLOT(setTextforLabel()));
    }

    ...
}

Тем не менее, это выглядит как довольно хрупкий дизайн, который может использовать некоторое переосмысление ...!

2 голосов
/ 15 декабря 2011
QObject *plugin = pluginLoader.instance();
if (plugin) {

    if (plugin->inherits("ActionInterface")) {
        myAction = qobject_cast<ActionInterface *>(plugin);
        pluginMenu->addAction(myAction->newAction());
    }

    if (plugin->inherits("LabelInterface")) {            
        myLabel = qobject_cast<LabelInterface *>(plugin);
        layout->addWidget(myLabel->newLabel());
    }

    if (myLabel && myAction)
        connect(myAction, SIGNAL(pushMyAction()),
            myLabel, SLOT(setTextforLabel()));
    }

    ...
}

Уберите этот "уродливый" проверочный счетчик. Не забудьте инициализировать myLabel и myAction с NULL

...