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的声明。回到mainwindow.h文件中,在MainWindow类中有一个私有数据成员:ui指针,该指针指向了Ui::MainWindow,且在mainwindow.cpp文件中实例了Ui::MainWindow类,而且还通过ui指针调用了setupUi()函数初始化了界面。在Qt中,正是通过这种方式将界面与逻辑进行了关联。

一个软件界面由很多界面元素组成,在实际工程开发中,通过QtCreator可以在xxx.ui文件中使用鼠标快速进行布局和创建界面组成元素。在对应的xxx.h/.cpp文件中使用ui指针则可以引用xxx.ui文件中生成的界面元素。

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



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4744

    浏览量

    68345
  • Qt
    Qt
    +关注

    关注

    1

    文章

    301

    浏览量

    37827
  • 矩形
    +关注

    关注

    0

    文章

    15

    浏览量

    12593

原文标题:学Qt,此问题必解!

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    驰AI办公本Turbo重磅发布

    近日,思驰AI办公本新品发布会如约而至,思驰IOT事业部首席产品官马斌斌详细介绍了思驰在智慧办公领域的深入思考和创新实践,并推出了思驰AI办公本Turbo。
    的头像 发表于 10-31 14:23 283次阅读

    QT5+OpenCV4搭建应用开发环境

    作为深度学习算法工程师,必须要掌握应用开发技能吗?搞工程肯定是必须要会界面开发,QT就是一个很不错的选择。本文以QT5.15 + OpenCV4.8 + OpenVINO2023为例,搭建应用开发环境,演示深度学习模型的QT应用
    的头像 发表于 07-23 11:23 990次阅读
    <b class='flag-5'>QT</b>5+OpenCV4搭建应用开发环境

    基线算所需的起算点应按何种顺序采用

    在地理信息系统(GIS)和大地测量中,基线算是一个关键的步骤,用于确定空间对象的精确位置。基线算通常涉及到多个起算点,这些起算点的选取和排序对于算的准确性和效率至关重要。本文将
    的头像 发表于 07-11 15:11 265次阅读

    米尔NXP i.MX 93开发板的Qt开发指南

    1.概述Qt是一个跨平台的图形应用开发框架,被应用在不同尺寸设备和平台上,同时提供不同版权版本供用户选择。米尔NXPi.MX93开发板(MYD-LMX9X开发板)使用Qt6.5版本进行应用开发。在
    的头像 发表于 06-07 08:01 1671次阅读
    米尔NXP i.MX 93开发板的<b class='flag-5'>Qt</b>开发指南

    在嵌入式系统中集成Rust和Qt的实践

    Rust 拥有丰富的库生态系统,用于序列化和反序列化、异步操作、解析不安全输入、线程、静态分析等,而 Qt 是一个 C++ 工具包,支持跨各种平台的丰富的、基于 GUI 的应用程序,从 iOS 到嵌入式Linux。Qt 应用程序包括表示业务逻辑的 C++ 插件
    发表于 05-03 10:26 1703次阅读
    在嵌入式系统中集成Rust和<b class='flag-5'>Qt</b>的实践

    易微再添新翼 易微青岛办事处正式成立

    易微砥砺奋进,再添新翼! 近日,易微青岛办事处正式成立,是易微在华东区域的又一重要战略布局。 青岛作为国家打造“一带一路”国际合作新平台的重点城市,将集成电路产业放在新兴产业发展重要位置,汇集
    的头像 发表于 04-14 10:34 399次阅读

    Qt上位机开发实战案例

    Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。 Qt Creator可带来两大关键益处: 提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触
    的头像 发表于 03-13 12:31 2239次阅读
    <b class='flag-5'>Qt</b>上位机开发实战案例

    3562-Qt工程编译说明

    本文档主要说明如何将已有 Qt 工程进行编译,生成可在评估板上正常运行的 ARM 端 Qt 程序镜像。 Qt 开发环境主要包括 Qt Creator 工具、X86 端
    的头像 发表于 03-05 09:19 426次阅读
    3562-<b class='flag-5'>Qt</b>工程编译说明

    QT开发学习笔记1(安装交叉编译器)

    QT安装交叉编译器
    的头像 发表于 02-18 10:02 859次阅读
    <b class='flag-5'>QT</b>开发学习笔记1(安装交叉编译器)

    Qt For OpenHarmony图形化的进展突破

    Qt 适配 OpenHarmony 意义 Qt 是一个 C++ 跨平台开发框架,主要用于开发图形用户界面(Graphical User Interface,GUI)程序,具有跨平台类库(支持目前
    的头像 发表于 02-02 14:29 1380次阅读
    <b class='flag-5'>Qt</b> For OpenHarmony图形化的进展突破

    基于QT5+OpenCV+OpenVINO C++的应用打包过程

    我用QT C++写了一个YOLOv5模型推理演示应用。
    的头像 发表于 01-26 10:17 1130次阅读
    基于<b class='flag-5'>QT</b>5+OpenCV+OpenVINO C++的应用打包过程

    TLT507-Qt工程编译说明

    TLT507-Qt工程编译说明
    的头像 发表于 01-26 09:37 1004次阅读
    TLT507-<b class='flag-5'>Qt</b>工程编译说明

    TL3588-Qt工程编译、GPU核心使用说明

    TL3588-Qt工程编译、GPU核心使用说明
    的头像 发表于 01-24 14:03 869次阅读
    TL3588-<b class='flag-5'>Qt</b>工程编译、GPU核心使用说明

    QT串口通信的简单使用

    QT串口通信是上位机和下位机通信常用的通信方式, 也是学习QT必须学会的基础知识, 这篇就简单介绍一下QT串口通信的简单使用.
    的头像 发表于 01-15 09:27 1822次阅读
    <b class='flag-5'>QT</b>串口通信的简单使用

    系统复位的特殊处理

    复位就是复位撤离,系统复位就是复位结束了系统准备开始工作。
    的头像 发表于 11-28 12:20 931次阅读
    系统<b class='flag-5'>解</b>复位的特殊处理