把自訂控制項整合到Qt Designer中

來源:互聯網
上載者:User

要想在Qt Designer中使用自訂控制項,必須要使Qt Designer能夠知道我們的自訂控制項的存在。有兩種方法可以把新自訂控制項的語音總機給Qt Designer:“升級(promotion)”法和外掛程式法。升級法最為簡便快捷。顧名思義,升級法就是把Qt自有的控制項進行升級改造一番。選一個Qt自有的控制項,如果它和我們新加的自訂控制項有著相似的API,那麼只要在Qt Designer的對話方塊裡面完成有關新控制項的資訊就一切大吉,新控制項就可以用在Qt Designer建立的form中。但是在編輯和預覽時,還是和Qt自有控制項表示沒有什麼兩樣。現在把HexSpinBox控制項用升級方法插入到一個form中:1.         用Qt Designer建立一個新的表單,把控制項箱裡的QSpinBox添加到表單中。2.         右擊spin box,選擇“Promote to Custom Widget”操作功能表。3.         在彈出的對話方塊中,類名處填寫“HexSpinBox”,標頭檔填寫“hexspinbox.h”好了。在uic產生的程式碼中包含有“hexspinbox.h”標頭檔而不是<QSpinBox>,還包含了一個HexSpinBox的執行個體,而不是QSpinBox。在Qt Designer中,HexSpinBox控制項由QSpinBox表示,並且可以設定所有的QSpinBox的屬性(如範圍、當前值)。

升級法的缺點是不能在Qt Designer中設定自訂控制項自己的特有屬性,也不能夠繪製自己。這些問題可以用外掛程式法解決。外掛程式法需要建立一個外掛程式庫,使Qt Designer能夠即時載入,用來建立控制項的執行個體。這樣,Qt Designer就可以在編輯表單或者預覽的時候使用自訂控制項。因為有了Qt的meta-object系統,Qt Designer能動態獲得自訂控制項的全部屬性。現在以IconEditor為例,用外掛程式法把IconEditor整合到Qt Designer中。首先,我們從QDesignerCustomWidgetInterface派生一個新類,重寫一些虛函數。我們假定這個外掛程式的原始碼在iconeditorplugin目錄中,IconEditor類的代碼在與它平行的目錄iconeditor中。這裡是外掛程式類的定義:
#include <QDesignerCustomWidgetInterface>class IconEditorPlugin : public QObject, public QDesignerCustomWidgetInterface{    Q_OBJECT    Q_INTERFACES(QDesignerCustomWidgetInterface)public:    IconEditorPlugin(QObject *parent = 0);    QString name() const;    QString includeFile() const;    QString group() const;    QIcon icon() const;    QString toolTip() const;    QString whatsThis() const;    bool isContainer() const;    QWidget *createWidget(QWidget *parent);};

IconEditorPlugin類是一個封裝了IconEditor控制項的工廠類,它使用了雙繼承,父類為QObject和QDesignerCustomWidgetInterface。宏Q_INTERFACES()告訴moc第二個基類為一個外掛程式介面類。Qt Designer使用該類中的函數建立IconEditor的執行個體並得到有關它的資訊。源檔案如下:
IconEditorPlugin::IconEditorPlugin(QObject *parent)    : QObject(parent){}QString IconEditorPlugin::name() const{    return "IconEditor";}QString IconEditorPlugin::includeFile() const{    return "iconeditor.h";}QString IconEditorPlugin::group() const{    return tr("Image Manipulation Widgets");}QIcon IconEditorPlugin::icon() const{    return QIcon(":/images/iconeditor.png");}QString IconEditorPlugin::toolTip() const{    return tr("An icon editor widget");}QString IconEditorPlugin::whatsThis() const{    return tr("This widget is presented in Chapter 5 of <i>C++ GUI "              "Programming with Qt 4</i> as an example of a custom Qt "              "widget.");}bool IconEditorPlugin::isContainer() const{    return false;}QWidget *IconEditorPlugin::createWidget(QWidget *parent){    return new IconEditor(parent);} Q_EXPORT_PLUGIN2(iconeditorplugin, IconEditorPlugin)

建構函式是一個空函數。函數name()返回外掛程式提供的控制項的名稱。函數includeFile()得到外掛程式封裝的特定控制項的標頭檔,這個標頭檔包含在uic工具產生的代碼中。函數group()返回的是該自訂控制項所屬的工具箱(box group)的名字。如果Qt Designer中沒有這個名字,就會為這個控制項建立一個新的組別。函數icon()返回自訂控制項在Qt Designer中使用的表徵圖。這裡我們假設IconEditorPlugin有關聯的資源檔,裡面有一個表徵圖編輯器映像的介面。函數toolTip() 完成在Qt Designer的控制項箱中,當滑鼠移動到自訂控制項時,顯示字串做為提示。函數whatsThis()返回Qt Designer顯示的“What’s This”提問。函數isContainer()返回true說明這個控制項可以包含其他控制項。例如,QFrame可以包含其他控制項,則它是一個容器控制項。很多Qt控制項都可以包含其他控制項,但是如果isContainer()返回false,Qt Designer就不允許這個控制項包含其他控制項了。Qt Designer調用函數createWidget()建立指定父控制項的控制項執行個體。宏Q_EXPORT_PLUGIN2()必須在源檔案的最後聲明,這個宏使Qt Designer能夠得到這個外掛程式。第一個參數是這個外掛程式的名字,第二個參數是實現這個外掛程式類的名字。.pro檔案如下:TEMPLATE        = libCONFIG         += designer plugin releaseHEADERS         = ../iconeditor/iconeditor.h /                  iconeditorplugin.hSOURCES         = ../iconeditor/iconeditor.cpp /                  iconeditorplugin.cppRESOURCES       = iconeditorplugin.qrcDESTDIR         = $(QTDIR)/plugins/designer.pro檔案假定環境變數QTDIR位於Qt的安裝目錄。在運行make或者nmake編譯外掛程式後,程式自動它安裝到Qt Designer的plugins目錄中。安裝成功後,我們就能象其他控制項一樣在Qt Designer中使用IconEditor控制項了。

如果想在Qt Designer整合多個自訂控制項,你可以為每個控制項建立一個的外掛程式,也可以把所有控制群組合到一個外掛程式中,從QDesignerCustomWidgetCollectionInterface派生。

地址:http://blog.csdn.net/Last_Impression/article/details/2438881

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.