Qt入門(11)——Qt外掛

尹成發表於2014-09-30
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,把外掛放置到該目錄下。

相關文章