0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt Designer中提供的原生界面元素

嵌入式小生 ? 來(lái)源:嵌入式小生 ? 2023-01-29 10:42 ? 次閱讀

一、導(dǎo)讀

Qt是一個(gè)跨平臺(tái)的軟件開(kāi)發(fā)工具,可以使用C++、Python、Qml語(yǔ)言開(kāi)發(fā)項(xiàng)目。在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,其提供了一個(gè)界面描述文件(xxx.ui)用于描述界面中有哪些元素,我們也可以使用對(duì)應(yīng)的設(shè)計(jì)工具Qt Designer手動(dòng)進(jìn)行界面設(shè)計(jì)和布局。

本文基于Qt Designer,描述其提供的原生界面元素,除此之外,還描述如何使用自定義控件擴(kuò)展Qt Designer。

二、Qt Designer中提供的原生界面元素

使用Qt Designer在.ui文件中進(jìn)行界面設(shè)計(jì)和布局時(shí)需要知道其包含哪些界面元素,如下圖所示:

6f4663f0-9f08-11ed-bfe3-dac502259ad0.png

一般情況下,使用上圖所示的界面元素就能完成軟件界面的設(shè)計(jì)了。

三、Qt Designer的擴(kuò)展接口類(lèi)

Qt提供了Qt Designer的擴(kuò)展接口,這些接口以類(lèi)的方式進(jìn)行設(shè)計(jì),命名為QDesignerxxx,如下圖所示:

6fa356b4-9f08-11ed-bfe3-dac502259ad0.png

為什么需要擴(kuò)展Qt Designer呢?Qt Designer定位是一款設(shè)計(jì)軟件,在實(shí)際項(xiàng)目工程開(kāi)發(fā)過(guò)程中,界面中的元素往往會(huì)重復(fù)出現(xiàn),這時(shí)候,可以將這些重復(fù)出現(xiàn)且具有共性的界面元素封裝成自定義的擴(kuò)展插件,并將其添加到Qt Designer中,這樣便可以在Qt Designer中直接用鼠標(biāo)拖拽使用,進(jìn)行信號(hào)和槽函數(shù)的編輯,加快了開(kāi)發(fā)效率。

下面來(lái)看看Qt中提供的幾個(gè)Qt Designer擴(kuò)展接口類(lèi)的含義:

(1)QDesignerActionEditorInterface:該接口用于更改Qt Designer的動(dòng)作編輯器。

(2)QDesignerContainerExtension:該接口用于在Qt Designer的工作空間中向自定義的多頁(yè)容器中添加頁(yè)面。

(3)QDesignerCustomWidgetCollectionInterface:該接口類(lèi)用于在一個(gè)庫(kù)中包含多個(gè)自定義的小部件。

(4)QDesignerCustomWidgetInterface:該接口類(lèi)用于允許Qt Designer訪問(wèn)和構(gòu)造自定義的小部件。

(5)QDesignerDynamicPropertySheetExtension:該類(lèi)允許在Qt Designer的屬性編輯器中操作小部件的動(dòng)態(tài)屬性。

(6)QDesignerFormEditorInterface:該類(lèi)用于訪問(wèn)Qt Designer的各種組件。

(7)QDesignerFormWindowInterface:該接口類(lèi)用于查詢(xún)和操作出現(xiàn)在Qt Designer工作區(qū)中的窗體窗口。

(8)QDesignerFormWindowManagerInterface:該類(lèi)用于在Qt Designer中操作窗體窗口的集合,并控制Qt Designer的窗體編輯操作。

(9)QDesignerMemberSheetExtension:該接口類(lèi)用于操作小部件的成員函數(shù),這些函數(shù)在使用Qt Designer的模式編輯信號(hào)和槽函數(shù)連接時(shí)顯示。

(10)QDesignerObjectInspectorInterface:該接口類(lèi)用于更改Qt Designer的對(duì)象檢查器。

(11)QDesignerPropertyEditorInterface:該接口類(lèi)用于查詢(xún)和操作Qt Designer的屬性編輯器的當(dāng)前狀態(tài)。

(12)QDesignerPropertySheetExtension:該接口類(lèi)用于操作小部件的屬性,這些屬性顯示在Qt Designer的屬性編輯器中。

(13)QDesignerTaskMenuExtension:該接口類(lèi)用于向Qt Designer的任務(wù)菜單中添加自定義的菜單項(xiàng)。

(14)QDesignerWidgetBoxInterface:該接口類(lèi)用于控制Qt Designer的小部件框的內(nèi)容。

四、使用自定義插件擴(kuò)展Qt Designer

要將自定義的小部件與QtDesigner集成,需要進(jìn)行兩方面的處理:

(1)需要對(duì)自定義的小部件進(jìn)行封裝描述,以便QtDesigner能夠識(shí)別。

(2)需要編寫(xiě)一個(gè)合適的.pro,用于構(gòu)建出合適的插件。

(4-1)創(chuàng)建接口描述

當(dāng)開(kāi)發(fā)好一個(gè)自定義的小部件后,則需要?jiǎng)?chuàng)建接口描述通知Qt Designer,才能將自定義的小部件作為插件添加到Qt Designer中。

在實(shí)際接口設(shè)計(jì)中,需創(chuàng)建QDesignerCustomWidgetInterface的子類(lèi),在子類(lèi)中描述小部件各種公開(kāi)的屬性,其中大部分是由基類(lèi)中的純虛函數(shù)提供的,我們只需要重載這些純虛函數(shù)并返回相應(yīng)的參數(shù)值即可。

QDesignerCustomWidgetInterface類(lèi)中提供的純虛函數(shù)如下表所示:

函數(shù) 返回值
name() 提供小部件類(lèi)的名稱(chēng)
group() 描述該小部件在Qt Designer的Widget Box視圖中所屬的組
toolTip() 是一個(gè)簡(jiǎn)短的描述,用于描述/識(shí)別Qt Designer中的小部件。
whatsThis() 在Qt Designer中為小部件提供更長(zhǎng)描述。
includeFile() 描述使用此小部件的應(yīng)用程序中必須包含的頭文件。此信息存儲(chǔ)在UI文件中,uic將使用這個(gè)信息在為包含自定義小部件的表單生成的代碼中創(chuàng)建合適的#include語(yǔ)句。
icon() 用于表示Qt Designer中Widget Box視圖下的小部件的圖標(biāo)。
isContainer() 如果小部件將用于存放子小部件,則為T(mén)rue;否則返回false。
createWidget() 指向自定義小部件實(shí)例的QWidget指針,由提供的父組件構(gòu)造。注意:createWidget()是一個(gè)工廠函數(shù),只負(fù)責(zé)創(chuàng)建小部件。自定義的小部件屬性直到load()返回才可以使用
domXml() 用于描述小部件的屬性,例如:它的對(duì)象名稱(chēng)、大小提示等信息
codeTemplate() 預(yù)留函數(shù)
initialize() 用于為自定義的小部件設(shè)置擴(kuò)展和其他功能
isInitialized() 如果小部件已經(jīng)初始化,則返回true;否則返回false。注意:在實(shí)際開(kāi)發(fā)中,重新實(shí)現(xiàn)函數(shù)通常需要檢查initialize()函數(shù),并返回測(cè)試的結(jié)果。

(4-2)插件導(dǎo)出

為了讓插件能夠在所有的平臺(tái)上都能正常工作,需要確保它們能夠?qū)С鯭t Designer所需要的符號(hào)。插件類(lèi)必須導(dǎo)出,這樣才可以讓Qt Designer加載,需要下述幾個(gè)步驟:

(1)使用Q_PLUGIN_METADATA()宏用于聲明插件的元數(shù)據(jù)。例如下列代碼:

Q_PLUGIN_METADATA(IID"org.qt-project.Qt.QDummyPlugin"FILE"mymetadata.json")

IID后面的字符串為插件的IID參數(shù)。FILE后面的字符串是可選的,指向一個(gè)json文件。

(2)使用QDESIGNER_WIDGET_EXPORT宏描述自定義的小部件類(lèi)。例如:

classQDESIGNER_WIDGET_EXPORTMyPlugin:publicQWidget
{
Q_OBJECT

public:
explicitMyPlugin(QWidget*parent=nullptr);

protected:
voidpaintEvent(QPaintEvent*event)override;
};

注:QDESIGNER_WIDGET_EXPORT宏定義必須添加,否則集成到Qt Creator 中編譯會(huì)報(bào)錯(cuò)。不加的話可以在設(shè)計(jì)器中加載,但是編譯會(huì)報(bào)錯(cuò)。

(3) 使用Q_INTERFACES宏讓Qt元對(duì)象系統(tǒng)知道這個(gè)插件。Q_INTERFACES 讓qobject_cast()能正確進(jìn)行QObject*到接口指針的轉(zhuǎn)換,就此我們可以判斷插件的合法性。

(4-3)構(gòu)建小部件

在前面描述了將已有自定義控件封裝成QtDesigner中使用的插件的代碼編寫(xiě)過(guò)程,本小節(jié)將描述如何構(gòu)建小部件,這一點(diǎn)則聚焦于.pro中,插件在編譯構(gòu)建后則會(huì)以庫(kù)文件的方式生成。

(1)在.pro工程配置文件中添加如下參數(shù)配置項(xiàng):

QT+=widgetsdesigner
CONFIG+=plugin
TEMPLATE=lib

QT += widgets designer語(yǔ)句添加了兩個(gè)模塊:widgets和designer,CONFIG += plugin語(yǔ)句用于描述這個(gè)工程是以插件的方式編譯構(gòu)建,TEMPLATE = lib語(yǔ)句用于描述工程以庫(kù)的方式構(gòu)建。

(2)在.pro工程配置文件中添加如下參數(shù)配置項(xiàng):

target.path=$$[QT_INSTALL_PLUGINS]/designer
INSTALLS+=target

變量$[QT_INSTALL_PLUGINS]是一個(gè)占位符,表示已安裝的Qt插件的位置。

上面語(yǔ)句的意思則是指定插件的安裝位置,當(dāng)執(zhí)行安裝操作后,會(huì)將生成的庫(kù)文件復(fù)制到對(duì)應(yīng)的目錄下(如何執(zhí)行安裝操作,后文會(huì)寫(xiě)到)。

(4-4)安裝小部件

(4-4-1)手動(dòng)安裝

如果插件工程能夠正常編譯構(gòu)建通過(guò),則會(huì)生成插件庫(kù)文件。這時(shí)候我們需要將其復(fù)制到Qt Designer下的插件庫(kù)目錄中。路徑為具體Qt構(gòu)建版本目錄/plugins/designer/中。

注:使用對(duì)應(yīng)的構(gòu)建套件編譯構(gòu)建出的插件庫(kù)只能安裝到對(duì)應(yīng)構(gòu)建套件目錄中的/plugins/designer/目錄下,這樣插件庫(kù)才能被對(duì)應(yīng)的Qt Designer正常加載和使用。

總而言之,編譯、構(gòu)建、安裝、QtDesigner版本需要一致。

(4-4-2)自動(dòng)安裝

在(4-3)小節(jié)的.pro工程描述文件中,使用INSTALLS指定了庫(kù)文件的安裝目錄,還需要添加一個(gè)安裝操作:

1、點(diǎn)擊QtCreator左側(cè)菜單欄下的『項(xiàng)目』一欄,進(jìn)入項(xiàng)目配置界面。

2、選擇『Build 的步驟』下的“添加Build步驟”,點(diǎn)擊“Custom Process Step”按鈕新建一個(gè)build步驟,在輸入框中輸入如下命令:

6fc3d84e-9f08-11ed-bfe3-dac502259ad0.png

注:上述圖片操作本質(zhì)是make install的寫(xiě)法,由于是在Windows下,所以變成了mingw32-make。install參數(shù)表示在編譯構(gòu)建完成后還需要執(zhí)行安裝操作。

通過(guò)以上步驟,當(dāng)在項(xiàng)目編譯構(gòu)建后,則會(huì)將生成的插件庫(kù)文件自動(dòng)復(fù)制到INSTALLS指定的目錄中。

(4-5)注意事項(xiàng)

如果小部件有特殊的行為,想要在Qt Designer中賦予這些行為,則需要在實(shí)際插件封裝代碼中提供initialize()函數(shù)的實(shí)現(xiàn),以告訴Qt Designer特定行為配置的小部件的構(gòu)造過(guò)程。

這個(gè)函數(shù)將在調(diào)用createWidget()之前首次被調(diào)用,并且在函數(shù)中可以設(shè)置一個(gè)內(nèi)部標(biāo)志,以便Qt Designer后續(xù)在調(diào)用插件的createWidget()函數(shù)時(shí)進(jìn)行判斷測(cè)試。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84682
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    117

    瀏覽量

    6964

原文標(biāo)題:盤(pán)一盤(pán)Qt Designer的界面元素

文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(QtDesigner)。其開(kāi)始界面如上圖所示。
    發(fā)表于 12-15 16:12

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    界面設(shè)計(jì)的時(shí)候。這是因?yàn)檫@種設(shè)計(jì)方式更加符合人類(lèi)思考的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器
    發(fā)表于 08-22 15:20

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(Qt Desi
    發(fā)表于 08-28 15:47

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(Qt Desi
    發(fā)表于 10-11 09:25

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(Qt Desi
    發(fā)表于 10-15 11:01

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(Qt Desi
    發(fā)表于 10-25 09:34

    Qt 設(shè)計(jì)器(Qt Designer)內(nèi)容總結(jié)

    的習(xí)慣,也比書(shū)寫(xiě)代碼要快速的多。Qt提供了這樣一個(gè)可視化的界面設(shè)計(jì)工具:Qt 設(shè)計(jì)器(Qt Desi
    發(fā)表于 10-27 09:27

    如何完成Qt5主窗口的界面設(shè)計(jì)

    Qt5學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程14:Qt5主窗口---界面設(shè)置這次任務(wù)要完成Qt5主窗口的界面設(shè)計(jì)Qt
    發(fā)表于 11-08 06:55

    基于QT/Embedded的可變情報(bào)板應(yīng)用程序開(kāi)發(fā)

    基于QT/Embedded的可變情報(bào)板應(yīng)用程序開(kāi)發(fā) QT是奇趣科技推出的一種多平臺(tái)的C++圖形用戶(hù)界面應(yīng)用程序框架。它包括QT開(kāi)發(fā)庫(kù)QT
    發(fā)表于 03-03 09:36 ?779次閱讀

    Qt用戶(hù)界面設(shè)計(jì)PPT

    QT使用的界面設(shè)計(jì)例子,可以作為入門(mén)人員的學(xué)習(xí)使用與操作,個(gè)人感覺(jué)還是不錯(cuò)的
    發(fā)表于 01-05 17:24 ?5次下載

    Qt DesignerQt Quick DesignerQt Creator應(yīng)用程序有什么區(qū)別?

    不管是Qt新手還是開(kāi)發(fā)過(guò)qt的群體來(lái)說(shuō),對(duì)Qt Designer、Qt Quick Designer
    的頭像 發(fā)表于 03-17 09:40 ?7270次閱讀

    Qt5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程14:Qt5主窗口---界面設(shè)置

    Qt5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程14:Qt5主窗口---界面設(shè)置這次任務(wù)要完成Qt5主窗口的界面設(shè)計(jì)Qt
    發(fā)表于 11-03 09:51 ?12次下載
    <b class='flag-5'>Qt</b>5 學(xué)習(xí)之路及嵌入式開(kāi)發(fā)教程14:<b class='flag-5'>Qt</b>5主窗口---<b class='flag-5'>界面</b>設(shè)置

    Qt ECG Monitor Qt嵌入式床旁心電監(jiān)護(hù)儀項(xiàng)目源碼

    Qt ECG Monitor是由Qt-UI開(kāi)發(fā)和維護(hù)的嵌入式床旁心電監(jiān)護(hù)儀界面項(xiàng)目。項(xiàng)目提供C++/Python語(yǔ)言,基于Qt5下
    發(fā)表于 01-10 11:41 ?31次下載
    <b class='flag-5'>Qt</b> ECG Monitor <b class='flag-5'>Qt</b>嵌入式床旁心電監(jiān)護(hù)儀項(xiàng)目源碼

    基于QT應(yīng)用、TCP應(yīng)用界面程序

    基于QT應(yīng)用,TCP應(yīng)用界面程序分享
    發(fā)表于 10-25 17:03 ?4次下載

    學(xué)Qt,“大小限定”背后的思路和“坑”

    在使用Qt開(kāi)發(fā)界面的時(shí)候,大小限定是常使用的操作。在界面元素的鼻祖QWidget中提供了一系列的方法,用于設(shè)定指定
    的頭像 發(fā)表于 02-02 10:31 ?1407次閱讀