1. 程式人生 > 其它 >Qt編寫自定義控制元件及外掛的使用

Qt編寫自定義控制元件及外掛的使用

Qt編寫自定義控制元件及外掛的使用

  在使用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原始碼。

個人總結:1 如果要在qtcreator的控制元件介面出現自定義控制元件,需要按照檢視的這個版本(MSVC 2017,32 bit)生成對應的庫,生成release版本(只能用release版本)然後放在F:\Qt\Qt5.9.9\Tools\QtCreator\bin\plugins\designer目錄中,新建qt專案,可以在qtcreator的設計面中看到對應的控制元件,

2 使用的時候,需要看選擇的構建專案型別,如果選擇msvc,release需要使用自定義控制元件生成的msvc,release版本庫,如果選擇msvc,debug,則需要使用自定義控制元件生成的msvc,release版本庫,如果選擇mingw debug構建,則需要使用自定義控制元件生成對應的mingw,debug庫。使用時必須要將自定義控制元件對應的.h,靜態,動態庫都拷貝到對應的使用專案中,在pro檔案中新增

LIBS += $$PWD/lib/libmylistviewctrlplugind.a(如果選擇msvc構建專案,需要使用lib)
INCLUDEPATH += $$PWD/include
,並將對應的dll放在執行目錄中。
3 如果需要在qt designer中出現對應的控制元件,需要將對應版本放在對應的desighner中,同樣只能用release版本,F:\Qt\Qt5.9.9\5.9.9\mingw53_32\plugins\designer

參考:

http://www.cnblogs.com/feiyangqingyun/p/6182320.html

http://blog.csdn.net/giselite/article/details/12622429