博客搬家自 http://zhouyuanchao.com/wordpress/archives/81
第21章 創建插件
動態鏈接庫
LIBS += -ldb_cxx
INCLUDEPATH += /usr/local/BerkeleyDb.4.2/include
QLibrary 動態加載dll
插件
常見的插件類型:
數據庫驅動程序、圖像格式、風格、文本編碼解碼器
實現一個插件
需要實現兩種類:
插件類 提供訪問插件功能(處理器類)的接口
處理器基類 插件提供的功能
class BronzeStylePlugin : public QStylePlugin { public: // 返回一個該插件可以創建的對象列表,不區分大小寫 virtual QStringList keys() const { return QStringList() << "Bronze"; } // 返回指定對象 virtual QStyle* create(const QString& key) { if (key.toLower() == "bronze"; return new BronzeStyle; return 0; } }; // cpp文件最後:第一個參數是插件名字 Q_EXPORT_PLUGIN2(bronzestyleplugin, BronzeStylePlugin)
.pro
TEMPLATE = lib
CONFIG += plugin // 指明是插件庫而不是通用庫
Qt應用程序在plugins目錄中尋找插件比如 plugins/styles
如果需要將Qt插件配置到其他目錄中
需要在代碼中擴展搜索路徑
QCoreApplication::addLibraryPath()
或設置QT_PLUGIN_PATH環境變量
自定義插件
1.定義接口
class TextArtInterface { // ... }; Q_DECLARE_INTERFACE(TextArtInterface, "com.software-inc.TextArt.TextArtInterface/1.0")
2. 定義插件
class BasicEffectsPlugin : public QObject , public TextArtInterface { // ... } Q_EXPORT_PLUGIN2(basiceffectsplugin, BasicEffectsPlugin)
感知插件,加載插件
QPluginLoader loader(filePath); interface = qobject_cast<TextArtInterface*>(loader.instance()); // instance() 返回QObject*
第22章 應用程序腳本
QtScript模塊 ECMAScript (JavaScript標準)
1.把腳本讀入QString
2.創建一個QScriptEngine對象,並設置應用程序相關的功能
3.執行腳本
QFileSystemWatcher
QTextStream in(&jsFile); in.setCodec("UTF-8"); QString script = in.readAll(); jsFile.close(); QScriptEngine interpreter; // 第二個參數爲傳入的參數 QScriptValue operand(&interpreter, display->text().toDouble()); interpreter.globalObject().setProperty("x", operand); QScriptValue result = interpreter.evaluate(script); if (result.isNumber) { // 腳本的返回值 // result.toNumber; }
腳本:
pi.js
return 3.14;
cube.js
return x * x * x;
QSyntaxHighlighter
QUiLoader
擴展QVariant處理的類型
Q_DECLARE_METATYPE(QScriptValue)
第23章 平臺相關特性
平臺相關的編程接口
Windows Win32
Mac OS X Carbon
X11 Xlib
QWidget::winId() 返回平臺相關的窗口句柄
QWidget::find() 返回指定窗口ID對應的QWidget
平臺相關宏定義
Q_WS_MAC
Q_WS_X11
Q_WS_WIN
Q_WS_QWS (Qtopia)
系統版本
QSysInfo::WindowsVersion()
QSysInfo::MacintoshVersion()
編譯器宏
Q_CC_MSVC
Qt/Windows桌面版 提供了ActiveQt框架,用以爲ActiveX和Qt提供完美結合。
ActiveQt由兩個模塊組成:
QAxContainer 允許我們使用COM對象並且可以在Qt應用程序中嵌入ActiveX控件
QAxServer 允許我們導出使用Qt編寫的自定義的COM對象和ActiveX控件
.pro
CONFIG += qaxcontainer
CONFIG += qaxserver
Q_ENUMS()宏
用來告訴moc在槽中使用的該類型爲一個枚舉類型
QAxObject封裝一個COM對象
QAxWidget封裝一個ActiveX控件
QAxBase爲QAxObject和QAxWidget實現了COM的核心功能
// setControl()將創建一個所需組件的實例 // ActiveX控件的所有屬性、事件和方法 // 都可以通過QAxWidget對象作爲Qt的屬性、信號和槽來加以使用 QAxWidget* wmp = new QAxWidget; wmp->setControl("{xxx-xxx-..."); // 控件的UUID wmp->setProperty("ShowControls", false); // 調用COM方法 wmp->dynamicCall("TitlePlay(uint)", 6);
編寫服務器
class AxBouncer : public QWidget, public QAxBindable { };
當包括一個源於QObject類的多重繼承的時候,必須總是把這個起源於QObject的類放在第一位,以便moc可以快速識別它。
Q_PROPERTY()宏 使用該宏聲明的屬性可以用setProperty()設置值
第24章 嵌入式編程
Qt/Embedded Linux (Qtopia Core)是爲嵌入式Linux優化過的Qt版本