在使用Qt Designer設計窗體界面時,我們可以使用Widget Box里的窗體控件非常方便的繪制界面,比如拖進去一個按鈕,一個文本編輯器等。雖然Qt Designer里的控件可以滿足我們大部分的需求,但是有時候,也會產生一些特殊的需要,比如一個輸入框,我們要輸入的是經緯度,此時就會有兩種輸入方式,一種是小數形式,一種是度分秒的形式,此時只使用一個簡單的LineEdit是無法滿足需求的。我們設想構造這樣一個輸入控件,它可以支持浮點數輸入,同時它還具有一個屬性,更改這個屬性可以使其切換為經緯度輸入形式。如果我們的多個窗體上都需要輸入經緯度,那么構造這樣一個控件,將會非常方便。下面就以此為例,講解一下如何創建自定義的窗體控件。
第一步:創建QtDesigner自定義控件工程
打開Qt Creator,創建一個Qt 設計師自定義控件,如下圖所示:
根據向導提示,建立一個新類,取名“Test"(注:首字母大寫,不能全小寫,不然后面會出錯),一直點擊”下一點“,完成工程創建。
工程創建完畢,如下圖所示:
第二步:編輯工程代碼
在新建的工程中,Test類沒有ui界面文件,我們要手動添加上去,如果沒有ui界面文件,工程編譯也可以通過,但該控件添加到ctreator后,一打開desinger工具的時候就會直接掛掉。所以,我們可以把原先的Test類的test.c和test.h刪除掉,重新添加一個Test類。
新建一個Test類,如下:
為了減少出錯機率,此時不對界面做任何動作。
在工程頭文件”test.h“中添加 “#include <QtUiPlugin/QDesignerExportWidget>”,在類名前添加”QDESIGNER_WIDGET_EXPORT“宏。如下圖:
第三步:編譯工程
保存並選擇release方式編譯。先qmake一下,
點擊左下角的”構建“按鈕,進行編譯。
編譯完成。此時會生成testplugin.dll和testplugin.lib兩個庫。
第四步:部署插件
編譯完成后,在輸出目錄下,找到對應的testplugin.dll和testplugin.lib兩個文件。分別拷貝到QT庫的designer路徑下和QT的IDE工具的designer路徑下。
以我本地5.7.0路徑為例:(具體以個人的QT安裝路徑為准)
QT庫的designer庫路徑:C:\software\GRG\Qt\Qt5.7.0\5.7\msvc2013\plugins\designer
QT庫的IDE路徑:C:\software\GRG\Qt\Qt5.7.0\Tools\QtCreator\bin\plugins\designer
第五步:測試使用插件
新建一個工程,在工程使用該Test自定義插件。
1、打開*.ui,在左下角會出現我們前面編譯的自定義插件,如下圖:
直接拖拽到ui界面。
2、在工程所在文件目錄中,新建include文件夾,將前面的插件頭文件test.h放在該include文件夾中。新建lib文件夾,將前面生成的testplugin.lib靜態庫放在此lib文件夾中。
3、打開測試工程的*.pro文件。添加相應的include路徑和lib路徑。
添加以下內容:
1 LIBS += $$PWD/lib/testplugin.lib 2 INCLUDEPATH += $$PWD/include
如下圖:
4、切換到release編譯模式,點擊qmake,生成相應的makefile文件。並將前面生成的testplugin.dll動態庫添加到release輸出目錄中。如下圖:
5、點擊構建,此時會生成*.exe到release輸出目錄。
此時。直接運行*.exe就可以使用該插件了。自定義插件的新建並使用到此算是OK了。
第六步:Qt自定義插件注意事項:
1:每個Qt庫bin目錄的designer可執行文件都是和該庫同一個編譯器編譯的,可用,如果想要集成到Qt Creator中,則需要注意版本,一般在windows上的Qt Creator版本是MSVC的,則需要對應的Qt庫也是MSVC編譯的,庫版本和編譯器版本必須保持一致才能是順利集成到Qt Creator的重要前提。
2:自定義控件的名稱不能小寫,否則拖過去的控件自動生成的默認名稱和類名一樣,會編譯通不過。這個問題坑了我很久,造成自動生成的UI代碼保存,一直沒有懷疑,后面才發現自動生成的代碼類名和實例名稱一樣,沖突導致的。
3:自定義控件類頭文件引入,Qt5.7以下版本為#include <QtDesigner/QDesignerExportWidget> 以上版本為#include <QtUiPlugin/QDesignerExportWidget>
4:類名前必須加入 QDESIGNER_WIDGET_EXPORT 宏。否則集成到Qt Creator 中編譯會報錯。不加的話可以在設計器中加載,但是編譯會報錯。
5:如果將生成好的dll文件放到Qt庫目錄下的 plugins\designer 下,可以在 designer 中看到。放到Qt Creator下的 bin\plugins\designer 則可以集成到Qt Creator中。
6:將自定義控件的頭文件、dll文件、lib(mingw編譯器為.a)文件復制出來,放到include(可自己隨便命名,我這里習慣用include)目錄,將include目錄放到項目的源碼文件下,在使用了自定義控件的項目的pro文件中,增加兩行 INCLUDEPATH += $$PWD/include LIBS += $$PWD/include/***.lib(mingw編譯器為.a) ,這樣可以正常編譯,但是編譯完成后不能運行,還需要將 對應自定義控件的dll文件復制到可執行文件同一目錄即可,至此大功告成。
番外話:大部分文章介紹都是將對應的庫文件和頭文件放到Qt安裝目錄對應文件夾下,為什么這里要放到一個include目錄,隨着項目一起呢?個人是這么理解的,隨項目一起,每次都可以很方便的將運行庫文件復制到可執行文件同一目錄,而不會忘記從Qt庫對應目錄找該運行庫。而且發布代碼的時候也可以有個很好的參考。
7:官網提供的Qt Creator版本基本上是MSVC版本,如果需要在mingw的Qt庫對應的Qt Creator中集成自定義控件,需要自己用對應的Qt庫編譯Qt Creator源碼。
參考:
http://www.cnblogs.com/feiyangqingyun/p/6182320.html
http://blog.csdn.net/giselite/article/details/12622429