我正在構建一個Qt應用程序。儘管之前我已經編寫了很多GUI,而且框架本身沒有出現問題,但我從來沒有編寫過任何(C#.NET應用程序之外的)有能力加載插件的東西。我試圖構建的項目有插件作爲它的一個組成部分,我認爲Qt框架看起來不錯,因爲它幾乎是普遍跨平臺的,並且似乎有一個非常好的插件系統。QPluginLoader實例總是返回null
我的問題是這樣的:我似乎無法得到QPluginLoader.instance()方法來返回除空值之外的任何內容。
從我的閱讀中,這是因爲它找不到插件。我想我可能忘記了做些什麼,但是我可以在實際編寫插件時找到很少的文檔(有一些例子,但它們並不令人難以置信地詳細)。有很多加載插件的例子,我認爲我這樣做是正確的,但我還沒有真正找到一個實際製作插件的例子。
這是我做了什麼:
使用Qt的造物主我已經創建了兩個項目:一個窗口應用程序假裝它是我的插件接收應用程序和共享庫項目冒充插件
在我的窗口應用程序,我有一個頭文件如下:
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H
#include <QtPlugin>
class QStringList;
class PluginInterface
{
public:
virtual ~PluginInterface() {};
virtual QStringList messages() const = 0;
};
Q_DECLARE_INTERFACE(PluginInterface,
"com.kevincuzner.LearningPlugins.PluginInterface/1.0")
#endif // PLUGININTERFACE_H
在我的共享庫的應用程序,我創建了一個名爲ATestPlugin類(這也是該項目的目標值):
#ifndef ATESTPLUGIN_H
#define ATESTPLUGIN_H
#include "ATestPlugin_global.h"
#include "../LearningPlugins/PluginInterface.h"
#include <QStringList>
class ATESTPLUGINSHARED_EXPORT ATestPlugin : public PluginInterface, public QObject
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
ATestPlugin();
virtual QStringList messages() const
{
//this part is actually defined in the .cpp file, but I don't feel like pasting that here
QStringList ret;
ret << "foo" << "bar" << "noms" << "Hello";
return ret;
}
};
#endif // ATESTPLUGIN_H
在我在我做了以下(&W¯¯點到主窗口)的主要方法放置Q_EXPORT_PLUGIN2(ATestPlugin, ATestPlugin)
然後在我的main.cpp文件ATestPlugin.cpp文件的末尾:
QString text = QFileDialog::getOpenFileName(&w, "Get a file");
QPluginLoader loader(text);
QObject* plugin = loader.instance();
if (plugin)
{
QMessageBox msgBox;
msgBox.setText(text);
msgBox.exec();
}
當我運行該程序並從彈出的文件對話框的庫項目的構建目錄中選擇libATestPlugin.so時,我看不到任何消息框,表示* plugin爲空。以前我總是彈出消息框並顯示選定的文件名,所以我知道該部分正在工作。
有沒有人有任何想法,我需要做什麼使我的插件可見QPluginLoader?
可能不是解決方案,但是我發現Qt可能很有趣,因爲在ATestPlugin的類繼承聲明中沒有首先使用'QObject'。 – cmannett85
您是否檢查插件是否在正確的位置? – Synxis