<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

學Qt,此問題必解!

嵌入式小生 ? 來源:嵌入式小生 ? 2023-01-04 14:25 ? 次閱讀

最近有小伙伴問到:在Qt開發中,當使用QtCreator自帶的工程向導創建了一個類后,如下代碼所示:

ca0a5f9a-8bf2-11ed-bfe3-dac502259ad0.png

問題來了:上圖紅色矩形框圈出的兩個地方描述的是同一個類嗎?

首先這個問題剛接觸Qt的時候可能會有此一問,在此處記錄一下。這里需要知道上述代碼是QtCreator自動生成的(如果使用向導創建一個類)。

用同樣的方法新創建一個類,(用鼠標點擊工程項目后,右鍵單擊,選擇“添加新文件”,在彈出的對話框中,選擇Qt->Qt設計師界面類->Widget)將會彈出“選擇類名”對話框:

ca3274a8-8bf2-11ed-bfe3-dac502259ad0.png

在上圖中,默認情況下其頭文件、源文件和Form文件都是同一個命名,點擊下一步后則創建一個名為Form的類,該類位于form.h/.cpp中。在from.h頭文件中,該類定義如下:

ca4d807c-8bf2-11ed-bfe3-dac502259ad0.png

可以看到,Form類和MainWindow類在生成方式上是一樣的。

好啦,如果我們在新創建類的時候為其重新命名:ca6b643e-8bf2-11ed-bfe3-dac502259ad0.png其自動生成的代碼還是那種方式的寫法:ca74bf84-8bf2-11ed-bfe3-dac502259ad0.png

至此,得出一個結論:

這是QtCreator的固定寫法,當我們新創建類的時候,QtCreator這個IDE會自動生成。

言歸正傳,回到本文的問題,下圖中紅色圈出的地方,雖然在名稱上是一樣的,但是他倆不是同一個東西。由于使用了QtCreator的類創建向導創建類,所以他們在名稱上是一樣的ca7cce9a-8bf2-11ed-bfe3-dac502259ad0.png

上述問題還引出了另一個問題:Qt中界面與邏輯的分離,在這一點上應該很好的體現這一思想。接著往下看:

QT_BEGIN_NAMESPACE
namespaceUi{classMainWindow;}
QT_END_NAMESPACE

本質上,上述代碼是UI界面類的聲明:QT_BEGIN_NAMESPACEQT_END_NAMESPACE兩個宏定義是Qt對命名空間的一個包裝,上述語句中,class MainWindow;則是指界面類。當我們的工程在編譯構建后,會生成一個類似于ui_xxx.h的文件,界面類則放置在這個文件中,本文則是ui_mainwindow.h,該文件會在對應的源文件中包含:ca9c75ba-8bf2-11ed-bfe3-dac502259ad0.png

注:ui_xxx.h是由QtCreator根據界面中的組成元素自動生成的,可在對應的xxx.ui文件中查看該類中包含了哪些界面組成元素。

由于此處mainwindow.ui文件中沒有放置多余的界面元素,故生成的文件比較簡單,這里是ui_mainwindow.h文件,自動生成代碼如下:

#ifndefUI_MAINWINDOW_H
#defineUI_MAINWINDOW_H

#include
#include
#include
#include
#include
#include

QT_BEGIN_NAMESPACE

classUi_MainWindow
{
public:
QWidget*centralwidget;
QMenuBar*menubar;
QStatusBar*statusbar;

voidsetupUi(QMainWindow*MainWindow)
{
if(MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(800,600);
centralwidget=newQWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
MainWindow->setCentralWidget(centralwidget);
menubar=newQMenuBar(MainWindow);
menubar->setObjectName(QString::fromUtf8("menubar"));
MainWindow->setMenuBar(menubar);
statusbar=newQStatusBar(MainWindow);
statusbar->setObjectName(QString::fromUtf8("statusbar"));
MainWindow->setStatusBar(statusbar);

retranslateUi(MainWindow);

QMetaObject::connectSlotsByName(MainWindow);
}//setupUi

voidretranslateUi(QMainWindow*MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow","MainWindow",nullptr));
}//retranslateUi

};

namespaceUi{
classMainWindow:publicUi_MainWindow{};
}//namespaceUi

QT_END_NAMESPACE

#endif//UI_MAINWINDOW_H

從上述代碼可見,在mainwindow.h文件中的:

namespaceUi{classMainWindow;}

則是對ui_mainwindow.h文件中定義的MainWindow的聲明?;氐絤ainwindow.h文件中,在MainWindow類中有一個私有數據成員:ui指針,該指針指向了Ui::MainWindow,且在mainwindow.cpp文件中實例了Ui::MainWindow類,而且還通過ui指針調用了setupUi()函數初始化了界面。在Qt中,正是通過這種方式將界面與邏輯進行了關聯。

一個軟件界面由很多界面元素組成,在實際工程開發中,通過QtCreator可以在xxx.ui文件中使用鼠標快速進行布局和創建界面組成元素。在對應的xxx.h/.cpp文件中使用ui指針則可以引用xxx.ui文件中生成的界面元素。

『這正是Qt框架的特性!』



審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4586

    瀏覽量

    67219
  • Qt
    Qt
    +關注

    關注

    1

    文章

    299

    瀏覽量

    37453
  • 矩形
    +關注

    關注

    0

    文章

    15

    瀏覽量

    12584

原文標題:學Qt,此問題必解!

文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Qt上位機開發實戰案例

    Qt Creator是一個用于Qt開發的輕量級跨平臺集成開發環境。 Qt Creator可帶來兩大關鍵益處: 提供首個專為支持跨平臺開發而設計的集成開發環境 (IDE),并確保首次接觸
    的頭像 發表于 03-13 12:31 ?874次閱讀
    <b class='flag-5'>Qt</b>上位機開發實戰案例

    3562-Qt工程編譯說明

    本文檔主要說明如何將已有 Qt 工程進行編譯,生成可在評估板上正常運行的 ARM 端 Qt 程序鏡像。 Qt 開發環境主要包括 Qt Creator 工具、X86 端
    的頭像 發表于 03-05 09:19 ?212次閱讀
    3562-<b class='flag-5'>Qt</b>工程編譯說明

    QT開發學習筆記1(安裝交叉編譯器)

    QT安裝交叉編譯器
    的頭像 發表于 02-18 10:02 ?462次閱讀
    <b class='flag-5'>QT</b>開發學習筆記1(安裝交叉編譯器)

    Qt For OpenHarmony圖形化的進展突破

    Qt 適配 OpenHarmony 意義 Qt 是一個 C++ 跨平臺開發框架,主要用于開發圖形用戶界面(Graphical User Interface,GUI)程序,具有跨平臺類庫(支持目前
    的頭像 發表于 02-02 14:29 ?692次閱讀
    <b class='flag-5'>Qt</b> For OpenHarmony圖形化的進展突破

    基于QT5+OpenCV+OpenVINO C++的應用打包過程

    我用QT C++寫了一個YOLOv5模型推理演示應用。
    的頭像 發表于 01-26 10:17 ?485次閱讀
    基于<b class='flag-5'>QT</b>5+OpenCV+OpenVINO C++的應用打包過程

    TLT507-Qt工程編譯說明

    TLT507-Qt工程編譯說明
    的頭像 發表于 01-26 09:37 ?584次閱讀
    TLT507-<b class='flag-5'>Qt</b>工程編譯說明

    QT串口通信的簡單使用

    QT串口通信是上位機和下位機通信常用的通信方式, 也是學習QT必須學會的基礎知識, 這篇就簡單介紹一下QT串口通信的簡單使用.
    的頭像 發表于 01-15 09:27 ?765次閱讀
    <b class='flag-5'>QT</b>串口通信的簡單使用

    全志T113開發板Qt遠程調試

    通常情況下工程師在調試Qt程序時,需要頻繁制作鏡像燒錄到核心板來測試Qt程序是否完善,這樣的操作既費時又費力。
    的頭像 發表于 01-10 17:48 ?2203次閱讀
    全志T113開發板<b class='flag-5'>Qt</b>遠程調試

    QT在Linux嵌入式設備上的系統配置

    QT是目前主流的UI界面設計軟件之一,Linux系統也支持QT應用,并且提供了很多方便的接口。所以有必要記錄一下基于QT,在LCD屏幕上實現UI界面功能的各種細節。
    發表于 10-11 10:58 ?491次閱讀
    <b class='flag-5'>QT</b>在Linux嵌入式設備上的系統配置

    Rust GUI實踐之Rust-Qt模塊

    Rust-Qt 是 Rust 語言的一個 Qt 綁定庫,它允許 Rust 開發者使用 Qt 框架來創建跨平臺的圖形界面應用程序。Qt 是一個跨平臺的應用程序框架,它提供了一系列的工具和
    的頭像 發表于 09-30 16:43 ?1134次閱讀

    QT5串口編程—編寫簡單的上位機

    首先,QT5是自帶QSerialPort這個類的,使用時需要在pro文件里面添加一行
    的頭像 發表于 09-19 15:11 ?1001次閱讀

    峰會回顧第29期 | Qt For OpenHarmony

    演講嘉賓 | 蔡萬蒼 回顧整理 | 廖? ?濤 排版校對 | 李萍萍 嘉賓簡介 蔡萬蒼,13年C++/Qt開發相關工作經驗,曾任職Qt公司,擔任技術支持、Qt咨詢師,協助國內多家Qt
    的頭像 發表于 09-07 08:45 ?715次閱讀
    峰會回顧第29期 | <b class='flag-5'>Qt</b> For OpenHarmony

    搭建一種跨平臺qt5遠程編譯環境

    所謂的跨平臺qt5遠程編譯環境,就是實現在本機的VS上寫Qt程序,然后在遠程的linux機器上進行編譯,得到Qt的Gui或非GUI程序。
    的頭像 發表于 07-25 15:05 ?820次閱讀
    搭建一種跨平臺<b class='flag-5'>qt</b>5遠程編譯環境

    RAA7884QT 數據表

    RAA7884QT 數據表
    發表于 07-05 20:04 ?0次下載
    RAA7884<b class='flag-5'>QT</b> 數據表

    Qt for MCUs 快速入門指南

    Qt for MCUs 快速入門指南
    發表于 06-30 19:16 ?1次下載
    <b class='flag-5'>Qt</b> for MCUs 快速入門指南
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>