?? plugins-howto.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/doc/plugins-howto.doc:1 --><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="Translator" content="farfareast"><meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt"><title>Qt插件HOWTO</title><style type="text/css"><!--h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }a:link { color: #004faf; text-decoration: none }a:visited { color: #672967; text-decoration: none }body { background: #ffffff; color: black; font-family: "Times New Roman" }--></style></head><body><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr bgcolor="#E5E5E5"><td valign=center> <a href="index.html"><font color="#004faf">主頁</font></a> | <a href="classes.html"><font color="#004faf">所有的類</font></a> | <a href="mainclasses.html"><font color="#004faf">主要的類</font></a> | <a href="annotated.html"><font color="#004faf">注釋的類</font></a> | <a href="groups.html"><font color="#004faf">分組的類</font></a> | <a href="functions.html"><font color="#004faf">函數</font></a></td><td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Qt插件HOWTO</h1><p>Qt提供了一個簡單地插件接口,可以輕松地生成作為獨立組件的定制數據庫驅動、圖象格式、文本編解碼器(text codec)、風格(style)和部件。<p> <b>警告:</b>Qt 3.0.5對插件的一些方面做了改變,具體涉及到裝載、路徑操作和庫版本。這些變化的結果是,Qt 3.0.4及以前版本編譯的插件<b><em>都不能</em></b>用于Qt 3.0.5及以后版本。<p>寫一個插件通過以下方式完成:寫適當的插件基類的子類,實現幾個函數,再添加一個宏。<p>一共有五個插件基類。派生的插件缺省保存于標準插件目錄。<p> <center><table cellpadding="4" cellspacing="2" border="0"><tr bgcolor="#a2c511"><th valign="top">基類<th valign="top">缺省路徑<tr bgcolor="#f0f0f0"><td valign="top"><a href="qimageformatplugin.html">QImageFormatPlugin</a><td valign="top"><tt>$QTDIR/plugins/imageformats</tt><tr bgcolor="#d0d0d0"><td valign="top"><a href="qsqldriverplugin.html">QSqlDriverPlugin</a><td valign="top"><tt>$QTDIR/plugins/sqldrivers</tt><tr bgcolor="#f0f0f0"><td valign="top"><a href="qstyleplugin.html">QStylePlugin</a><td valign="top"><tt>$QTDIR/plugins/styles</tt><tr bgcolor="#d0d0d0"><td valign="top"><a href="qtextcodecplugin.html">QTextCodecPlugin</a><td valign="top"><tt>$QTDIR/plugins/codecs</tt><tr bgcolor="#f0f0f0"><td valign="top"><a href="qwidgetplugin.html">QWidgetPlugin</a><td valign="top"><tt>$QTDIR/plugins/designer</tt></table></center><p>假設你有一個新的風格類,叫做'MyStyle',你要把它做成插件的形式。需要的代碼直截了當:<pre> class MyStylePlugin : public <a href="qstyleplugin.html">QStylePlugin</a> { public: MyStylePlugin() {} ~MyStylePlugin() {} <a href="qstringlist.html">QStringList</a> keys() const { return QStringList() << "MyStyle"; } <a href="qstyle.html">QStyle</a>* create( const <a href="qstring.html">QString</a>& key ) { if ( key == "MyStyle" ) return new MyStyle; return 0; } }; Q_EXPORT_PLUGIN( MyStylePlugin )</pre><p>構造器和解構器不需要做什么,空的就可以。有兩個虛函數一定要實現。第一個是keys(),它返回在插件中實現的類的一個字符串列表。(我們在上面的例子中剛剛實現了一個類。)第二個是一個函數,它返回所要的類的一個對象(或者0,如果插件被要求生成一個不存在的類的對象)。對于<a href="qstyleplugin.html">QStylePlugin</a>來說,這第二個函數叫做create()。<p>可以在一個插件里實現任意數目的插件子類,只要他們都是由同一個基類,比如說,QStylePlugin,派生出來的。<p>對于數據庫驅動、圖象格式、定制部件和文本編解碼器,不需要顯式的對象生成過程。Qt會按需求查找并生成他們。風格則是例外,因為你可能想以代碼顯式地設置一個風格。應用一個風格,可以使用類似代碼:<pre> QApplication::<a href="qapplication.html#setStyle">setStyle</a>( QStyleFactory::<a href="qstylefactory.html#create">create</a>( "MyStyle" ) );</pre> <p>有的插件類還需要實現其他函數。關于一個<a href="qwidgetplugin.html">QWidgetPlugin</a>的完全例子,可參見<a href="designer-manual.html">Qt設計器手冊</a>中'生成定制部件'一章的'生成定制部件'節。這個例子實現了額外的函數,以把該插件集成到<em>Qt設計器</em>中去。<a href="qwidgetfactory.html">QWidgetFactory</a>類提供了關于QWidgetPlugin的附加信息。<p>關于每種類型的插件必須要實現哪些虛擬函數,詳見該類的文檔。<p>Qt的應用自動辨識哪些插件可用,因為插件都是保存在標準插件子目錄下的。為此,應用不需要任何查找和裝載插件的代碼,既然Qt已自動處理了。<p>插件的缺省目錄是<tt>$QTDIR/plugins</tt>,每種類型的插件在那種類型的子目錄下,比如說,<tt>風格(styles)</tt>。如果你想要你的應用使用插件但不要標準插件路徑,可以讓你的安裝程序決定你要為插件使用的路徑,然后保存該路徑,比如說使用<a href="qsettings.html">QSettings</a>,以使應用在運行時可以讀取。之后應用可以用該路徑調用<a href="qapplication.html#addLibraryPath">QApplication::addLibraryPath</a>(),就可以使用你的插件了。注意,路徑的最后部分,也就是說,<tt>styles</tt>、<tt>widgets</tt>等等,不能改變。<p>應用包括一個插件的正規方法是,要么把插件與應用一起編譯,要么把插件編譯為<tt>DLL</tt>(或者<tt>so</tt>或者其他平臺指定的庫類型),像其他庫那樣使用。如果要讓插件可裝載,一個方法是,生成一個應用下的子目錄,例如,<tt>appdir/plugins/designer</tt>,把插件放置到該目錄下。<p> <h2>裝載與校驗插件</h2><a name="1"></a><p>在裝載插件時,Qt庫做了一些穩健的檢查,以確定插件是否可以裝載和使用。這一點保證了多重版本的能力和分頭所安裝的Qt庫的配置。<ul><li>與高一點的主版本和/或次版本的Qt庫鏈接的插件,不能被低的主版本和/或次版本的庫所裝載。(譯者注:補丁版本不限)<p> <em>原因解釋:</em><p>依靠新的Qt庫而鏈接的插件可能使用了一些舊版本沒有的新特性。Trolltech有一項政策:只在次級發布(minor release)之間添加新特性和API,這就是為什么本測試只看主版本號和次版本號,不看補丁級版本號的緣故。<p> <li>依靠<em>帶有</em>線程支持的Qt庫而鏈接的插件,只能被<em>帶有</em>線程支持的Qt庫所裝載。<p> <em>原因解釋:</em><p>線程和非線程的Qt庫有不同的名稱。<em>帶有</em>線程支持的庫裝載一個依靠<em>不帶有</em>線程支持的Qt庫而鏈接的插件,將會導致在內存中同時有同一庫的兩個版本。在UNIX系統中,這會導致非線程Qt庫被裝載。這時,Qt庫中的所有靜態對象的構造器都會被調用第二次,但是它們是對已經在內存中的對象進行操作。沒有辦法繞過這一點,因為這是對象二進制格式的一個特征:已經被線程Qt庫定義的靜態符號,不能在被非線程Qt庫被裝載的時候被替換或者拷貝。<p> <li>依靠<em>不帶有</em>線程支持的Qt庫而鏈接的插件,只能被<em>不帶有</em>線程支持的Qt庫所裝載。<p> <em>原因解釋:</em><p>參見上面的解釋。<p> <li>從Qt 3.0.5開始,Qt庫與所有插件都使用<em>聯編關鍵字(build key)</em>來聯編。Qt庫中的聯編關鍵字被與插件中的聯編關鍵字對照,如果相符,插件就被裝載。如果聯編關鍵字不符,Qt庫就拒絕裝載該插件。<p> <em>原因解釋:</em><p>參見下面對于build key的解釋。</ul><p> <h2>聯編關鍵字(build key)</h2><a name="2"></a><p>聯編關鍵字包含一下信息:<ul><li>體系結構(Architecture)、操作系統和編譯器。<p> <em>原因解釋:</em><p>在同一編譯器的不同版本并不產生二進制兼容代碼的場合,編譯器的版本也體現在聯編關鍵字里。<p> <li>Qt的配置。這個配置是一個列表,包括了影響庫中可用到的API的那些缺少的特性。<p> <em>原因解釋:</em><p>兩個同一版本的Qt庫的不同配置不是二進制兼容的。裝載插件的Qt庫使用這個(缺少的)特性列表來判斷插件是不是二進制兼容的。<p> <em>注意:</em>也存在這種情況,插件可以使用在兩個不同配置里可用到的特性。但是,編寫插件的開發者需要知道,哪些特性在他們的插件和Qt的公用工具類中都在被使用。Qt庫在裝載插件時會需要復雜的特性與依賴性的查詢確認。這些需求給開發者添了一個不必要的負擔,也增加了裝載插件的系統開銷。為了減少開發時間,降低應用的運行時消耗,可以使用對聯編關鍵字的簡單字符串比較。<p> <li>可選地,可以在配置腳本命令行指定一個附加的字符串。<p> <em>原因解釋:</em><p>在發布帶有應用的Qt庫的二進制時,這給開發者提供了一個辦法,來編寫只能被插件以之鏈接的那個庫所裝載的插件。</ul><p> <h2>插件與線程應用</h2><a name="3"></a><p>如果你想聯編一個使用線程Qt庫的插件(不管插件本身是否使用線程),你必須使用線程環境。具體說來,你必須用線程Qt庫鏈接插件,必須用該庫聯編<a href="designer-manual.html">Qt設計器</a>。你用于插件的<tt>.pro</tt>文件必須包括這一行:<pre> CONFIG += thread</pre><p> <b>警告:</b>不要在應用中混用一般的Qt庫與線程Qt庫。如果你的應用使用了線程Qt庫,你不應該用一般Qt庫鏈接你的插件,也不應該動態裝載一般Qt庫或者動態裝載依賴一般Qt庫的另一個庫,比如一個插件。在一些系統中,混用線程與非線程庫或者插件會破壞(corrupt)Qt庫中使用的靜態數據。<p> <!-- eof --><p><address><hr><div align=center><table width=100% cellspacing=0 border=0><tr><td>Copyright © 2002 <a href="http://www.trolltech.com">Trolltech</a><td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a><td><a href="zh_CN.html">譯者:farfareast</a><td align=right><div align=right>Qt 3.0.5版</div></table></div></address></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -