QObject :: connect:无法连接(null)

时间:2011-12-13 17:30:13

标签: qt plugins qt4 widget

我尝试加载插件。如果它们加载成功,那么我必须连接返回的小部件。

使用一个插件我创建一个动作并将其添加到菜单,使用另一个插件我创建一个标签并将其添加到窗口。即使我在运行时(当app加载插件时)出现此错误,这两个小部件也会被创建并且可见。但他们之间没有联系。

这是我尝试连接小部件的方式

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 个答案:

答案 0 :(得分:3)

你有两个不同的插件。显然,可以将一个投放到ActionInterface但不投放到LabelInterface,另一个可以投放到LabelInterface而不是ActionInterface

你的想法似乎是,一旦你加载了两个插件(并且验证计数为2),那么在这些插件之间进行连接调用是安全的。但是,您似乎试图将第二个加载的插件转换为两者信号和插槽。这是因为每次运行代码时都会覆盖myActionmyLabel。所以至少:

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()));
    }

    ...
}

不过,这看起来像一个相当脆弱的设计,可以使用一些重新思考......!

答案 1 :(得分:2)

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()));
    }

    ...
}

删除这个“丑陋”的验证计数器。记得用NULL初始化myLabel和myAction