Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QObject::connect:无法连接(空)_Qt_Plugins_Qt4_Widget - Fatal编程技术网

Qt QObject::connect:无法连接(空)

Qt QObject::connect:无法连接(空),qt,plugins,qt4,widget,Qt,Plugins,Qt4,Widget,我尝试加载到插件。如果它们加载成功,那么我必须连接返回的小部件 我用一个插件创建一个动作并将其添加到菜单中,用另一个插件创建一个标签并将其添加到窗口中。即使我在运行时(当应用程序加载插件时)遇到这个错误,这两个小部件也会被创建并可见。但它们之间没有联系 这就是我尝试连接小部件的方式 QObject *plugin = pluginLoader.instance(); if (plugin) { myAction = qobject_cast<ActionInterface *>

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

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

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

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*plugin=pluginLoader.instance();
如果(插件){
myAction=qobject_cast(插件);
如果(我的行动){
插件菜单->添加操作(myAction->newAction());
验证++;
}
myLabel=qobject_cast(插件);
if(myLabel){
布局->添加小部件(myLabel->newLabel());
验证++;
}
如果(验证==2)
连接(myAction,信号(pushMyAction()),
myLabel,SLOT(setTextforLabel());
}
...
}
错误消息是:

QObject::connect:无法连接(null)::pushMyAction()到LabelPlugin::setTextforLabel()


你有两个不同的插件。显然,一个可以转换为
操作界面
,但不能转换为
标签界面
,另一个可以转换为
标签界面
,但不能转换为
操作界面

您的想法似乎是,一旦加载了两个插件(验证计数为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()));
    }

    ...
}
QObject*plugin=pluginLoader.instance();
如果(插件){
ActionInterface*myActionTemp=qobject_cast(插件);
如果(myActionTemp){
myAction=myActionTemp;
插件菜单->添加操作(myAction->newAction());
验证++;
}
LabelInterface*myLabelTemp=qobject_cast(插件);
if(myLabelTemp){
myLabel=myLabelTemp;
布局->添加小部件(myLabel->newLabel());
验证++;
}
/*如果(myAction和myLabel)不那么复杂*/
如果(验证==2){
连接(myAction,信号(pushMyAction()),
myLabel,SLOT(setTextforLabel());
}
...
}

尽管如此,这看起来像是一个相当脆弱的设计,可能需要一些反思

您有两个不同的插件。显然,一个可以转换为
操作界面
,但不能转换为
标签界面
,另一个可以转换为
标签界面
,但不能转换为
操作界面

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

    ...
}
您的想法似乎是,一旦加载了两个插件(验证计数为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()));
    }

    ...
}
QObject*plugin=pluginLoader.instance();
如果(插件){
ActionInterface*myActionTemp=qobject_cast(插件);
如果(myActionTemp){
myAction=myActionTemp;
插件菜单->添加操作(myAction->newAction());
验证++;
}
LabelInterface*myLabelTemp=qobject_cast(插件);
if(myLabelTemp){
myLabel=myLabelTemp;
布局->添加小部件(myLabel->newLabel());
验证++;
}
/*如果(myAction和myLabel)不那么复杂*/
如果(验证==2){
连接(myAction,信号(pushMyAction()),
myLabel,SLOT(setTextforLabel());
}
...
}
尽管如此,这看起来像是一个相当脆弱的设计,可能需要一些反思

QObject*plugin=pluginLoader.instance();
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()));
    }

    ...
}
如果(插件){ 如果(插件->继承(“ActionInterface”)){ myAction=qobject_cast(插件); 插件菜单->添加操作(myAction->newAction()); } 如果(插件->继承(“标签接口”){ myLabel=qobject_cast(插件); 布局->添加小部件(myLabel->newLabel()); } if(myLabel&&myAction) 连接(myAction,信号(pushMyAction()), myLabel,SLOT(setTextforLabel()); } ... }
移除此“丑陋”验证计数器。记住用NULL初始化myLabel和myAction

QObject*plugin=pluginLoader.instance();
如果(插件){
如果(插件->继承(“ActionInterface”)){
myAction=qobject_cast(插件);
插件菜单->添加操作(myAction->newAction());
}
如果(插件->继承(“标签接口”){
myLabel=qobject_cast(插件);
布局->添加小部件(myLabel->newLabel());
}
if(myLabel&&myAction)
连接(myAction,信号(pushMyAction()),
myLabel,SLOT(setTextforLabel());
}
...
}

移除此“丑陋”验证计数器。记住用NULL初始化myLabel和myAction,我们在这里看不到将verify设置为0的地方。因此,可能您从上一次验证中携带了一个值1……它会增加1,因为myLabel不是null,然后即使myAction是null,它也会增加到2。否则,如果verify为2,myAction为null…这里还有其他错误…@HostileFork我在类构造函数MainWindow::MainWindow(){verify=0;…}中设置了它。那么,这里的代码不是要使用verify计数来确认
myAction
myLabel
都不是null吗?如果您没有在每次运行此代码时重置它,那么它就不能提供这种保证。你不能连接一个空的对象指针。但是为什么它是空的呢?myAction用于向菜单添加操作,并没有触发任何错误,但在connect方法中显示为Null。我们在这里看不到将verify设置为0的位置。因此,您可能从以前的验证中携带了值1。。