服務(wù)近2000家企業(yè),依托一系列實踐中打磨過的技術(shù)和產(chǎn)品,根據(jù)企業(yè)的具體業(yè)務(wù)問題和需求,針對性的提供各行業(yè)大數(shù)據(jù)解決方案。
QT客戶端開發(fā)之創(chuàng)建并使用Qt自定義控件
來源:未知 時間:2018-08-17 瀏覽次數(shù):170次
QT客戶端開發(fā)之創(chuàng)建并使用Qt自定義控件,QT這個C++框架雖然提供較多的界面布局組件,但是實際開發(fā)QT庫中自帶的組件往往不能滿足開發(fā)需要,需要我們自定義組件
在使用Qt Designer設(shè)計窗體界面時,我們可以使用Widget Box里的窗體控件非常方便的繪制界面,比如拖進去一個按鈕,一個文本編輯器等。雖然Qt Designer里的控件可以滿足我們大部分的需求,但是有時候,也會產(chǎn)生一些特殊的需要,比如一個輸入框,我們要輸入的是經(jīng)緯度,此時就會有兩種輸入方式,一種是小數(shù)形式,一種是度分秒的形式,此時只使用一個簡單的LineEdit是無法滿足需求的。我們設(shè)想構(gòu)造這樣一個輸入控件,它可以支持浮點數(shù)輸入,同時它還具有一個屬性,更改這個屬性可以使其切換為經(jīng)緯度輸入形式。如果我們的多個窗體上都需要輸入經(jīng)緯度,那么構(gòu)造這樣一個控件,將會非常方便。下面就以此為例,講解一下如何創(chuàng)建自定義的窗體控件。
在使用Qt Designer設(shè)計窗體界面時,我們可以使用Widget Box里的窗體控件非常方便的繪制界面,比如拖進去一個按鈕,一個文本編輯器等。雖然Qt Designer里的控件可以滿足我們大部分的需求,但是有時候,也會產(chǎn)生一些特殊的需要,比如一個輸入框,我們要輸入的是經(jīng)緯度,此時就會有兩種輸入方式,一種是小數(shù)形式,一種是度分秒的形式,此時只使用一個簡單的LineEdit是無法滿足需求的。我們設(shè)想構(gòu)造這樣一個輸入控件,它可以支持浮點數(shù)輸入,同時它還具有一個屬性,更改這個屬性可以使其切換為經(jīng)緯度輸入形式。如果我們的多個窗體上都需要輸入經(jīng)緯度,那么構(gòu)造這樣一個控件,將會非常方便。下面就以此為例,講解一下如何創(chuàng)建自定義的窗體控件。
第一步:創(chuàng)建QtDesigner自定義控件工程
打開Qt Creator,創(chuàng)建一個Qt 設(shè)計師自定義控件,如下圖所示:

根據(jù)向?qū)崾?,?chuàng)建好工程,這里取名為LogLatEdit,工程目錄如下圖所示:

第二步:編譯控件工程
為了淌通整個自定義控件的編寫流程,我們先不做任何更改,切換為Release版本,直接編譯一下。
第三步:部署插件
編譯完成后,在輸出目錄下,將生成的dll文件和lib文件一起拷貝到Qt的插件目錄下,以我使用的Qt 4.8.4為例,在Qt 4.8.4的安裝目錄D:Qt4.8.4下,找到plugins目錄,在其中找到designer目錄,然后把dll和lib放進去,完整路徑為:D:Qt4.8.4pluginsdesigner。之后,啟動D:Qt4.8.4bin下的designer.exe,創(chuàng)建一個窗體,此時就會發(fā)現(xiàn)在左側(cè)的Widget Box里出現(xiàn)了我們自己的LogLatEdit控件,我們可以像使用其它控件一樣,把我們自己的控件拖繪到窗體上,如下圖所示:

如果自定義控件沒有出現(xiàn)在Widgetbox里,那么此時你可以通過【幫助-關(guān)于插件】菜單,打開插件信息對話框,點擊刷新按鈕,只要你沒有忘記把dll和lib文件拷貝到正確的位置,插件都會自動識別并加載。對于其它版本的Qt也一樣,比如我自己的電腦里安裝了好幾個版本的Qt,對于其它版本的Qt,做法也是一樣,只需要把插件工程生成的dll和lib文件放置到相應(yīng)版本的插件目錄下去即可。
到此,我們就理清了如何創(chuàng)建一個自定義控件,并且知道了如何部署、加載并使用自定義控件。下面我們開始編寫我們需要的控件,對于只想了解自定義控件開發(fā)過程的讀者,至此就已經(jīng)知道如何做了,那么后面的內(nèi)容您可以略過不讀了。
未完,待續(xù)。
控件編寫完畢以后,把生成的dll和lib文件一起拷貝到Qt安裝目錄下的插件目錄里,比如我安裝在D盤里的Qt 4.8.4,路徑為:D:Qt4.8.4pluginsdesigner,拷貝進去以后,這個插件就可以被Qt Designer加載了,此時這個自定義控件就可以像普通的控件一樣使用了。當然如有必要,還可以給這個控件添加一些信號和槽,另外按照經(jīng)緯度的取值范圍不同,做一下區(qū)分經(jīng)度和維度的處理,本例中不需要這么復(fù)雜,就不再深入探索了,下面是使用自定義的經(jīng)緯度輸入控件的效果:

到目前為止,我們已經(jīng)可以在Qt Designer中使用自定義的控件繪制界面了,但是這個時候,事情還沒有完,因為使用QtCreator時,會發(fā)現(xiàn)其界面設(shè)計器中并沒有我們的自定義控件。另外當我們用Qt Designer繪制完控件后,編譯時會發(fā)生找不到“loglatedit.h”頭文件的編譯錯誤。這個問題很容易理解,首先我們可以想到的是Qt Creator和Qt Designer的自定義控件目錄是不同的,我自己的機器里,Qt和Qt Creator的安裝目錄如下:

當我把自定義控件的dll和lib文件拷貝到D:Qt4.8.4pluginsdesigner目錄下,再啟動D:Qt4.8.4bin目錄下的designer.exe,這個插件可以加載到Widget Box里面去,但是如果我啟動D:Qtqtcreator-2.8.1bin目錄下的Qt Creator,我們的插件并不會出現(xiàn)在Qt Creator的設(shè)計器中。因此,對于Qt Creator,我們也需要執(zhí)行以下控件的安裝,那么具體要安裝到哪里去呢?經(jīng)過在Qt Creator安裝目錄下一番查找,發(fā)現(xiàn)D:Qtqtcreator-2.8.1binpluginsdesigner這個目錄下存在和D:Qt4.8.4pluginsdesigner目錄下同名的dll文件,于是我們猜測這個目錄就是Qt Creator的控件安裝目錄,接下來拷貝loglateditplugin.dll到這個目錄下,之后重新打開Qt Creator,發(fā)現(xiàn)自定義控件加載成功了,于是第一個問題解決了。

對于第二個問題,我們很容易想到使用一個動態(tài)庫時,除了要有dll和lib文件外,還需要頭文件,而對于某一版本的Qt SDK,其界面相關(guān)的頭文件都放置在QtGui目錄下,于是我將工程中經(jīng)緯度輸入控件的頭文件loglatedit.h拷貝到D:Qt4.8.4includeQtGui目錄下,再次試驗,發(fā)現(xiàn)編譯可以通過,但是連接失敗,嘗試將相應(yīng)的lib文件放到D:Qt4.7.4lib目錄下并且把該lib庫添加為工程的依賴庫,依然連接失敗。這表明Qt的自定義控件工程并沒有導(dǎo)出我們的自定義控件,因此其生成的庫文件loglateditplugin.lib里并沒有自定義控件的信息。因此要使用自定義控件,只能引入源碼。
通過以上實驗,總結(jié)一下具體的做法,列舉如下:
1. 創(chuàng)建Qt 設(shè)計師自定義控件工程,編寫自定義控件;
2. 拷貝release版的dll和lib文件到Qt Designer的插件目錄下,如D:Qt4.8.4pluginsdesigner,這樣自定義控件即可在Qt Designer中使用;
3. 拷貝dll文件到Qt Creator的集成Qt Designer的插件目錄下,如:D:Qtqtcreator-2.8.1binpluginsdesigner,使集成于Qt Creator中的Qt Designer可以加載并使用該控件;
4. 拷貝自定義控件的頭文件和源文件到使用自定義控件的工程中,并且添加到工程里面去,這樣就可以正確編譯并連接了;