[英]QPluginLoader instance always returns null
我正在構建Qt應用程序。 雖然我之前已經編寫了許多GUI東西,而框架本身並沒有出現問題,但我從未編程過任何能夠加載插件的東西(C#.NET應用程序之外)。 我正在嘗試構建的項目將插件作為其不可或缺的一部分,我認為Qt框架對此看起來不錯,因為它幾乎普遍都是跨平台的,並且似乎有一個非常好的插件系統。
我的問題是: 我似乎無法讓QPluginLoader.instance()方法返回除null值之外的任何值 。
根據我的閱讀,這是因為它找不到插件。 我想我可能忘了做某事,但是我發現關於實際編寫插件的文檔很少(有示例,但是沒有詳盡介紹)。 有很多加載插件的例子,我想我做對了,但是我還沒有找到實際制作插件的例子。
這是我所做的:
使用Qt-Creator,我創建了兩個項目:一個假裝是我的插件接收應用程序的窗口應用程序,以及一個假裝是插件的共享庫項目。
在窗口應用程序中,我有一個頭文件,如下所示:
#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的類(這也是項目的TARGET值):
#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
在ATestPlugin.cpp文件的末尾,我放置了Q_EXPORT_PLUGIN2(ATestPlugin, ATestPlugin)
然后在main方法的main.cpp文件中,執行以下操作(&w指向主窗口):
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為null。 以前,我總是彈出消息框並顯示選定的文件名,因此我知道該部分正在工作。
是否有人對我的插件對QPluginLoader可見有什么想法?
它對我不起作用。 將您以前的TARGET更改為$$ qtLibraryTarget(...),可以確保在不同平台上進行構建時的正確擴展。
我在QPluginLoader中遇到了同樣的問題。 簡而言之,我是如何解決的:我創建了插件庫,比如說lib1.dll,它使用來自lib2.dll的一些東西。 在我的應用程序中,我嘗試通過QPluginLoader加載lib1。
QPluginLoader loader( adaptersDir.absoluteFilePath(fileName) );
AdapterInterface* adapterIface = qobject_cast<AdapterInterface*>(loader.instance());
在這種情況下,loader.instance()返回0。解決方法是將lib2.dll復制到應用程序文件夾中,因為應用程序將其用於正確的加載插件lib1。
經過進一步的實驗,我設法加載了插件。 我這么說讓我感到有些毛骨悚然,但這是RTFM的經典案例。
echo插件教程 (直到我發布問題后才找到),必須對庫中的.pro文件進行一些修改才能使其正確聲明插件:
行TARGET = ATestPlugin
必須更改為TARGET = $$qtLibraryTarget(ATestPlugin)
。 進行此更改后,在上述程序中彈出我的消息框,稍后當我運行qobject_cast< PluginInterface* >(plugin)
,然后要求運行PluginInterface->messages()
我得到了在單獨的類中實現的列表。
另外,我確實更改了繼承順序,將QObject放在首位,並且因為它以這種方式工作,所以我可能會保持它不變(盡管我不知道它是否有所作為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.