簡體   English   中英

QPluginLoader實例始終返回null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM