詳解如何建立Qt插件學習教程
如何建立Qt插件學習教程是本文要介紹的內容,主要是來了解QT中插件的應用,如何來建立,文中有詳解,具體內容的實現來看詳解。
QT提供2個API來建立插件
1、高層API擴展QT庫。例如定制的數據庫驅動,圖像格式,字符編碼,custom styles
2、底層API擴展QT應用程序
例如,如果想寫自定義QStyle的子類,并讓應用程序動態加載,需要使用高層API函數
因為高層API在底層API基礎上構造,兩者需要注意一些問題。
如果需要提供給QT Designeder插件,請參考QtDesigner模型文檔
高層API
利用繼承特定的基類來實現插件,需要實現其中的一些函數,并增加一個宏
QT中有不少插件的基類可供使用,繼承的插件默認保存在標準插件目錄的子目錄下,否則Qt會找不到。
設計一個style類名為MyStyle的插件
文件mystyleplugin.h:
- class MyStylePlugin : public QStylePlugin
- {
- public:
- QStringList keys() const; //返回此插件能夠使用的style名稱列表。
- QStyle *create(const QString &key);//根據傳入的style名稱,返回style。
- };
- mystyleplugin.cpp
- #include "mystyleplugin.h"
- QStringList MyStylePlugin::keys() const
- {
- return QStringList() << "MyStyle";
- }
- QStyle *MyStylePlugin::create(const QString &key)
- {
- if (key.toLower() == "mystyle")
- return new MyStyle;
- return 0;
- }
- Q_EXPORT_PLUGIN2(pnp_mystyleplugin, MyStylePlugin)
風格實現
文件mystyle.h:
- class MyStyle : public QWindowsStyle
- {
- Q_OBJECT
- public:
- MyStyle() {};
- void polish(QPalette &palette);
- };
繼承自QWindowsStyle
風格實現
- void MyStyle::polish(QPalette &palette)
- {
- palette.setBrush(QPalette::Button, Qt::red);
- }
(注意其中實現的大小寫方式)。
實現數據庫驅動,圖像格式、文本編碼和大多數其他插件類型時,一般不需要建立對象,Qt會找到他們并建立他們的對象。Style是一個特例,因為程序中科能會這樣調用:
- QApplication::setStyle(QStyleFactory::create("MyStyle"));
main.c文件:
- int main(int argv, char *args[])
- {
- QApplication app(argv, args);//QT此時加載了插件
- QApplication::setStyle(QStyleFactory::create("simplestyle"));
- StyleWindow window;
- window.resize(200, 50);
- window.show();
- return app.exec();
- }
工程文件:
- TEMPLATE = lib
- CONFIG += plugin
- HEADERS = simplestyle.h \
- simplestyleplugin.h
- SOURCES = simplestyle.cpp \
- simplestyleplugin.cpp
- TARGET = simplestyleplugin
注意,插件需要設置TEMPLATE,因為我們需要的是共享庫而不是執行程序。同時必須設置CONFIG。需要將此插件保存到style文件夾(應用程序所在的文件夾)。這樣應用程序就能夠檢測得到。
底層API:沒有詳細研究
不管是QT本身還是QT應用程序都可以通過插件擴展。這需要應用程序檢測并通過QPluginLoader進行加載。因此,插件可以提供任意功能,而不僅限于上面說的插件。
插件擴展應用包括4個步驟
1、定義插件的接口集(實際上是只有虛函數的一個類)
2、Q_DECLARE_INTERFACE宏告訴meta-object系統此接口的存在。
3、利用QPluginLoader加載插件
4、使用qobject_cast()函數測試插件實現的借口
插件編碼的4個步驟
1、繼承QObject定義一個插件類,并定義插件需要的接口
2、使用Q_InterFaces()宏告訴meta-object系統接口的存在
3、使用Q_EXPORT_PLUGIN2()宏輸出插件
4、編譯工程
例如下面例子:
接口類:
- class FilterInterface //只有虛函數的類
- {
- public:
- virtual ~FilterInterface() {}
- virtual QStringList filters() const = 0;
- virtual QImage filterImage(const QString &filter, const QImage &image,
- QWidget *parent) = 0;
- };
插件類,實現接口
- #include <QObject>
- #include <QStringList>
- #include <QImage>
- #include <plugandpaint/interfaces.h>
- class ExtraFiltersPlugin : public QObject, public FilterInterface
- {
- Q_OBJECT
- Q_INTERFACES(FilterInterface)
- public:
- QStringList filters() const;
- QImage filterImage(const QString &filter, const QImage &image,
- QWidget *parent);
- };
定位插件
QT應用程序自動加載插件,因為插件存在標準插件的子目錄中
開發過程中,插件的目錄在QTDIR/plugins中(QDIR是QT安裝的目錄)。如果希望應用程序使用或不使用標準插件,安裝會得到希望安裝插件的路徑,并保存路徑(例如應用程序使用QSettings在啟動時讀取它)
應用程序可以通過QCoreApplication:addLibraryPath是插件對于應用程序可見,注意,最終的路徑不能改變。
如果希望插件可被加載,一種方法是在應用程序的所在目錄的子目錄下保存此插件。如果想發布QT自帶的任何插件,需要拷貝plugins的子目錄到應用程序的根目錄下。(而不是包含插件的目錄)
靜態插件
一般的方法是將插件做成動態庫和應用程序一塊發布。插件動態檢測和加載。
應用程序可以靜態鏈接。假如編譯的是靜態的QT庫,那么靜態插件就是唯一的選擇了。使用靜態插件可以降低錯誤概率。但是缺點是修改插件需要重新編譯整個應用程序。
QT提供一些靜態的插件:
為了靜態鏈接插件,需要在程序中使用Q_IMPORT_PLUGIN宏,需要在編譯時使用QTPLUGIN參數。例如,在main.cpp中
- #include <QApplication>
- #include <QtPlugin>
- Q_IMPORT_PLUGIN(qjpeg)
- Q_IMPORT_PLUGIN(qgif)
- Q_IMPORT_PLUGIN(qkrcodecs)
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- ...
- return app.exec();
- }
工程文件中
- QTPLUGIN += qjpeg \
- qgif \
- qkrcodecs
小結:詳解如何建立Qt插件學習教程的內容介紹完了,希望通過本文的學習能對你有所幫助!

















