我尝试加载插件。如果它们加载成功,那么我必须连接返回的小部件。
使用一个插件我创建一个动作并将其添加到菜单,使用另一个插件我创建一个标签并将其添加到窗口。即使我在运行时(当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()
答案 0 :(得分:3)
你有两个不同的插件。显然,可以将一个投放到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()));
}
...
}
不过,这看起来像一个相当脆弱的设计,可以使用一些重新思考......!
答案 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