當前位置:
首頁 >
Qt入门(11)——Qt插件
發布時間:2025/3/15
21
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Qt入门(11)——Qt插件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Qt提供了一個簡單地插件接口,可以輕松地生成作為獨立組件的定制數據庫驅動、圖象格式、文本編解碼器(text codec)、風格(style)和部件。
警告:Qt 3.0.5對插件的一些方面做了改變,具體涉及到裝載、路徑操作和庫版本。這些變化的結果是,Qt 3.0.4及以前版本編譯的插件都不能用于Qt 3.0.5及以后版本。
寫一個插件通過以下方式完成:寫適當的插件基類的子類,實現幾個函數,再添加一個宏。
一共有五個插件基類。派生的插件缺省保存于標準插件目錄。
基類缺省路徑
QImageFormatPlugin $QTDIR/plugins/imageformats QSqlDriverPlugin $QTDIR/plugins/sqldrivers QStylePlugin $QTDIR/plugins/styles QTextCodecPlugin $QTDIR/plugins/codecs QWidgetPlugin $QTDIR/plugins/designer
假設你有一個新的風格類,叫做'MyStyle',你要把它做成插件的形式。需要的代碼直截了當:
class MyStylePlugin : public QStylePlugin{public:MyStylePlugin() {}~MyStylePlugin() {}QStringList keys() const { return QStringList() << "MyStyle"; }QStyle* create( const QString& key ) { if ( key == "MyStyle" ) return new MyStyle;return 0;}};
? ? Q_EXPORT_PLUGIN( MyStylePlugin )
構造器和解構器不需要做什么,空的就可以。有兩個虛函數一定要實現。第一個是keys(),它返回在插件中實現的類的一個字符串列表。(我們在上面的例子中剛剛實現了一個類。)第二個是一個函數,它返回所要的類的一個對象(或者0,如果插件被要求生成一個不存在的類的對象)。對于QStylePlugin來說,這第二個函數叫做create()。
可以在一個插件里實現任意數目的插件子類,只要他們都是由同一個基類,比如說,QStylePlugin,派生出來的。
對于數據庫驅動、圖象格式、定制部件和文本編解碼器,不需要顯式的對象生成過程。Qt會按需求查找并生成他們。風格則是例外,因為你可能想以代碼顯式地設置一個風格。應用一個風格,可以使用類似代碼:
QApplication::setStyle( QStyleFactory::create( "MyStyle" ) );
有的插件類還需要實現其他函數。關于一個QWidgetPlugin的完全例子,可參見Qt設計器手冊中'生成定制部件'一章的'生成定制部件'節。這個例子實現了額外的函數,以把該插件集成到Qt設計器中去。QWidgetFactory類提供了關于QWidgetPlugin的附加信息。
關于每種類型的插件必須要實現哪些虛擬函數,詳見該類的文檔。
Qt的應用自動辨識哪些插件可用,因為插件都是保存在標準插件子目錄下的。為此,應用不需要任何查找和裝載插件的代碼,既然Qt已自動處理了。
插件的缺省目錄是$QTDIR/plugins,每種類型的插件在那種類型的子目錄下,比如說,風格(styles)。如果你想要你的應用使用插件但不要標準插件路徑,可以讓你的安裝程序決定你要為插件使用的路徑,然后保存該路徑,比如說使用QSettings,以使應用在運行時可以讀取。之后應用可以用該路徑調用QApplication::addLibraryPath(),就可以使用你的插件了。注意,路徑的最后部分,也就是說,styles、widgets等等,不能改變。
應用包括一個插件的正規方法是,要么把插件與應用一起編譯,要么把插件編譯為DLL(或者so或者其他平臺指定的庫類型),像其他庫那樣使用。如果要讓插件可裝載,一個方法是,生成一個應用下的子目錄,例如,appdir/plugins/designer,把插件放置到該目錄下。
警告:Qt 3.0.5對插件的一些方面做了改變,具體涉及到裝載、路徑操作和庫版本。這些變化的結果是,Qt 3.0.4及以前版本編譯的插件都不能用于Qt 3.0.5及以后版本。
寫一個插件通過以下方式完成:寫適當的插件基類的子類,實現幾個函數,再添加一個宏。
一共有五個插件基類。派生的插件缺省保存于標準插件目錄。
基類缺省路徑
QImageFormatPlugin $QTDIR/plugins/imageformats QSqlDriverPlugin $QTDIR/plugins/sqldrivers QStylePlugin $QTDIR/plugins/styles QTextCodecPlugin $QTDIR/plugins/codecs QWidgetPlugin $QTDIR/plugins/designer
假設你有一個新的風格類,叫做'MyStyle',你要把它做成插件的形式。需要的代碼直截了當:
class MyStylePlugin : public QStylePlugin{public:MyStylePlugin() {}~MyStylePlugin() {}QStringList keys() const { return QStringList() << "MyStyle"; }QStyle* create( const QString& key ) { if ( key == "MyStyle" ) return new MyStyle;return 0;}};
? ? Q_EXPORT_PLUGIN( MyStylePlugin )
構造器和解構器不需要做什么,空的就可以。有兩個虛函數一定要實現。第一個是keys(),它返回在插件中實現的類的一個字符串列表。(我們在上面的例子中剛剛實現了一個類。)第二個是一個函數,它返回所要的類的一個對象(或者0,如果插件被要求生成一個不存在的類的對象)。對于QStylePlugin來說,這第二個函數叫做create()。
可以在一個插件里實現任意數目的插件子類,只要他們都是由同一個基類,比如說,QStylePlugin,派生出來的。
對于數據庫驅動、圖象格式、定制部件和文本編解碼器,不需要顯式的對象生成過程。Qt會按需求查找并生成他們。風格則是例外,因為你可能想以代碼顯式地設置一個風格。應用一個風格,可以使用類似代碼:
QApplication::setStyle( QStyleFactory::create( "MyStyle" ) );
有的插件類還需要實現其他函數。關于一個QWidgetPlugin的完全例子,可參見Qt設計器手冊中'生成定制部件'一章的'生成定制部件'節。這個例子實現了額外的函數,以把該插件集成到Qt設計器中去。QWidgetFactory類提供了關于QWidgetPlugin的附加信息。
關于每種類型的插件必須要實現哪些虛擬函數,詳見該類的文檔。
Qt的應用自動辨識哪些插件可用,因為插件都是保存在標準插件子目錄下的。為此,應用不需要任何查找和裝載插件的代碼,既然Qt已自動處理了。
插件的缺省目錄是$QTDIR/plugins,每種類型的插件在那種類型的子目錄下,比如說,風格(styles)。如果你想要你的應用使用插件但不要標準插件路徑,可以讓你的安裝程序決定你要為插件使用的路徑,然后保存該路徑,比如說使用QSettings,以使應用在運行時可以讀取。之后應用可以用該路徑調用QApplication::addLibraryPath(),就可以使用你的插件了。注意,路徑的最后部分,也就是說,styles、widgets等等,不能改變。
應用包括一個插件的正規方法是,要么把插件與應用一起編譯,要么把插件編譯為DLL(或者so或者其他平臺指定的庫類型),像其他庫那樣使用。如果要讓插件可裝載,一個方法是,生成一個應用下的子目錄,例如,appdir/plugins/designer,把插件放置到該目錄下。
轉載于:https://www.cnblogs.com/new0801/p/6176889.html
總結
以上是生活随笔為你收集整理的Qt入门(11)——Qt插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ffmpeg 扩展第三方库编译系列]
- 下一篇: Y2K Accounting Bug(p