把自訂控制項整合到Qt Designer中(Integrating Custom Widgets with Qt Designer

來源:互聯網
上載者:User
把自訂控制項整合到Qt Designer中(Integrating Custom Widgets with Qt Designer(轉)要想在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的屬性(如範圍、當前值)。 Figure 5.6. Qt Designer's custom widget dialog

  

升級法的缺點是不能在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
派生。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.