这可能是一个非常基本的C ++问题,但我根本无法找到正确执行此操作的方法:
我需要在我的GUI类的方法中创建“ QPluginLoader”类的某些实例,并将这些实例存储在QList中。 QPluginLoader实例必须在整个GUI类中都可用。 但是,每当我尝试通过我的QList访问QPluginLoader时,程序就会崩溃。我认为这是因为一旦超出实例化QPluginLoader类的作用域,它便被销毁,因此在创建QPluginLoader并将其存储到QList的方法之外,该方法不可用。
但是如何使实例在整个类中可用?
这是我尝试过的:
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void onThreadTerminated();
private:
bool loadPlugins();
QList<QPluginLoader*> loaderList;
};
mainwindow.cpp
bool MainWindow::loadPlugins()
{
QDir pluginsDir(qApp->applicationDirPath());
pluginsDir.cd("plugins");
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject* plugin = pluginLoader.instance();
if (plugin)
{
loaderList.push_back(&pluginLoader);
pluginCount++;
}
}
return false;
}
最后但并非最不重要的是,使我的程序崩溃的插槽
// SLOT
void MainWindow::onThreadTerminated()
{
while (!loaderList.isEmpty()) {
if(loaderList.takeFirst()->isLoaded()) loaderList.takeFirst()->unload();
}
loaderList.clear();
}
答案 0 :(得分:0)
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
pluginLoader
将在下一个}
处销毁,并且您在loaderList
中保留此销毁对象的引用。
使用pluginLoader
动态为new
分配内存,并在QPluginLoader
中保留指向loaderList
的指针
当然,您必须记住要为QPluginLoader
s释放分配的内存
答案 1 :(得分:0)
问题是loadPlugins
函数中的这两行
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
...
loaderList.push_back(&pluginLoader);
第一个定义 local 对象pluginLoader
。第二个将指向该本地对象的指针推入容器。
问题在于,当循环迭代(或结束)时,pluginLoader
的生命周期结束并且被破坏,指向它的指针变为无效。
在我看来,您不应该具有插件加载程序的容器,而应该具有实际的插件本身。
如果您确实希望在容器中安装插件加载器,则需要使用new
动态创建插件加载器,或者至少为其使用智能指针。或者,如对您的问题的评论中所述,请使用QPluginLoader
对象的容器。