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和myActionQObject*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。。