詳解如何建立Qt插件學(xué)習(xí)教程
如何建立Qt插件學(xué)習(xí)教程是本文要介紹的內(nèi)容,主要是來了解QT中插件的應(yīng)用,如何來建立,文中有詳解,具體內(nèi)容的實(shí)現(xiàn)來看詳解。
QT提供2個(gè)API來建立插件
1、高層API擴(kuò)展QT庫。例如定制的數(shù)據(jù)庫驅(qū)動(dòng),圖像格式,字符編碼,custom styles
2、底層API擴(kuò)展QT應(yīng)用程序
例如,如果想寫自定義QStyle的子類,并讓應(yīng)用程序動(dòng)態(tài)加載,需要使用高層API函數(shù)
因?yàn)楦邔覣PI在底層API基礎(chǔ)上構(gòu)造,兩者需要注意一些問題。
如果需要提供給QT Designeder插件,請(qǐng)參考QtDesigner模型文檔
高層API
利用繼承特定的基類來實(shí)現(xiàn)插件,需要實(shí)現(xiàn)其中的一些函數(shù),并增加一個(gè)宏
QT中有不少插件的基類可供使用,繼承的插件默認(rèn)保存在標(biāo)準(zhǔn)插件目錄的子目錄下,否則Qt會(huì)找不到。
設(shè)計(jì)一個(gè)style類名為MyStyle的插件
文件mystyleplugin.h:
- class MyStylePlugin : public QStylePlugin
- {
- public:
- QStringList keys() const; //返回此插件能夠使用的style名稱列表。
- QStyle *create(const QString &key);//根據(jù)傳入的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)
風(fēng)格實(shí)現(xiàn)
文件mystyle.h:
- class MyStyle : public QWindowsStyle
- {
- Q_OBJECT
- public:
- MyStyle() {};
- void polish(QPalette &palette);
- };
繼承自QWindowsStyle
風(fēng)格實(shí)現(xiàn)
- void MyStyle::polish(QPalette &palette)
- {
- palette.setBrush(QPalette::Button, Qt::red);
- }
(注意其中實(shí)現(xiàn)的大小寫方式)。
實(shí)現(xiàn)數(shù)據(jù)庫驅(qū)動(dòng),圖像格式、文本編碼和大多數(shù)其他插件類型時(shí),一般不需要建立對(duì)象,Qt會(huì)找到他們并建立他們的對(duì)象。Style是一個(gè)特例,因?yàn)槌绦蛑锌颇軙?huì)這樣調(diào)用:
- QApplication::setStyle(QStyleFactory::create("MyStyle"));
main.c文件:
- int main(int argv, char *args[])
- {
- QApplication app(argv, args);//QT此時(shí)加載了插件
- 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
注意,插件需要設(shè)置TEMPLATE,因?yàn)槲覀冃枰氖枪蚕韼於皇菆?zhí)行程序。同時(shí)必須設(shè)置CONFIG。需要將此插件保存到style文件夾(應(yīng)用程序所在的文件夾)。這樣應(yīng)用程序就能夠檢測得到。
底層API:沒有詳細(xì)研究
不管是QT本身還是QT應(yīng)用程序都可以通過插件擴(kuò)展。這需要應(yīng)用程序檢測并通過QPluginLoader進(jìn)行加載。因此,插件可以提供任意功能,而不僅限于上面說的插件。
插件擴(kuò)展應(yīng)用包括4個(gè)步驟
1、定義插件的接口集(實(shí)際上是只有虛函數(shù)的一個(gè)類)
2、Q_DECLARE_INTERFACE宏告訴meta-object系統(tǒng)此接口的存在。
3、利用QPluginLoader加載插件
4、使用qobject_cast()函數(shù)測試插件實(shí)現(xiàn)的借口
插件編碼的4個(gè)步驟
1、繼承QObject定義一個(gè)插件類,并定義插件需要的接口
2、使用Q_InterFaces()宏告訴meta-object系統(tǒng)接口的存在
3、使用Q_EXPORT_PLUGIN2()宏輸出插件
4、編譯工程
例如下面例子:
接口類:
- class FilterInterface //只有虛函數(shù)的類
- {
- public:
- virtual ~FilterInterface() {}
- virtual QStringList filters() const = 0;
- virtual QImage filterImage(const QString &filter, const QImage &image,
- QWidget *parent) = 0;
- };
插件類,實(shí)現(xiàn)接口
- #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應(yīng)用程序自動(dòng)加載插件,因?yàn)椴寮嬖跇?biāo)準(zhǔn)插件的子目錄中
開發(fā)過程中,插件的目錄在QTDIR/plugins中(QDIR是QT安裝的目錄)。如果希望應(yīng)用程序使用或不使用標(biāo)準(zhǔn)插件,安裝會(huì)得到希望安裝插件的路徑,并保存路徑(例如應(yīng)用程序使用QSettings在啟動(dòng)時(shí)讀取它)
應(yīng)用程序可以通過QCoreApplication:addLibraryPath是插件對(duì)于應(yīng)用程序可見,注意,最終的路徑不能改變。
如果希望插件可被加載,一種方法是在應(yīng)用程序的所在目錄的子目錄下保存此插件。如果想發(fā)布QT自帶的任何插件,需要拷貝plugins的子目錄到應(yīng)用程序的根目錄下。(而不是包含插件的目錄)
靜態(tài)插件
一般的方法是將插件做成動(dòng)態(tài)庫和應(yīng)用程序一塊發(fā)布。插件動(dòng)態(tài)檢測和加載。
應(yīng)用程序可以靜態(tài)鏈接。假如編譯的是靜態(tài)的QT庫,那么靜態(tài)插件就是唯一的選擇了。使用靜態(tài)插件可以降低錯(cuò)誤概率。但是缺點(diǎn)是修改插件需要重新編譯整個(gè)應(yīng)用程序。
QT提供一些靜態(tài)的插件:
為了靜態(tài)鏈接插件,需要在程序中使用Q_IMPORT_PLUGIN宏,需要在編譯時(shí)使用QTPLUGIN參數(shù)。例如,在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
小結(jié):詳解如何建立Qt插件學(xué)習(xí)教程的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!