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

    文章

    4945

    浏览量

    73211
  • Qt
    Qt
    +关注

    关注

    2

    文章

    318

    浏览量

    40351
  • 矩形
    +关注

    关注

    0

    文章

    15

    浏览量

    12765

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    tiny4412 Qt环境搭建

    1.硬件环境 PC端:ubuntu18.04 开发板硬件平台:tiny4412 内核版本:linux3.5 交叉编译器:arm-linux-gcc Qt版本:Qt5.6 2.搭建 ubuntu 下
    的头像 发表于 10-21 09:54 296次阅读
    tiny4412 <b class='flag-5'>Qt</b>环境搭建

    RK3506开发板QT Creator开发手册,交叉编译工具链与QT应用示例,入门必备

    本文基于触觉智能RK3506核心板/开发板介绍QTCreator交叉编译配置与QT应用示例。如需购买开发板进行评估验证简介QTCreatorQtCreator‌是由TheQtCompany开发的跨平台集成开发环境(IDE),专为Qt框架设计,支持C++、QML、Pyth
    的头像 发表于 09-30 16:26 3387次阅读
    RK3506开发板<b class='flag-5'>QT</b> Creator开发手册,交叉编译工具链与<b class='flag-5'>QT</b>应用示例,入门必备

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Qt工程编译、GPU核心使用说明

    本文围绕创龙科技研发的评估板,详细说明 Qt 工程编译与 GPU 核心使用方法。涵盖基于命令行和 Qt Creator 工具的 Qt 工程编译流程,包括交叉编译工具链、Qt Versi
    的头像 发表于 09-29 14:16 403次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—<b class='flag-5'>Qt</b>工程编译、GPU核心使用说明

    LVGL近期很多人问,那它和Qt哪个好?

    最近拜访做工业控制、智能家居的客户时,常被问到同一个问题:嵌入式产品,GUI选LVGL还是Qt? 其实工具选择没有绝对的“好”与“坏”,但选对适配场景的GUI图形用户界面工具,能直接让产品开发效率
    的头像 发表于 09-23 15:54 875次阅读
    LVGL近期很多人问,那它和<b class='flag-5'>Qt</b>哪个好?

    驰声音转换算法通过国家备案

    近日,国家互联网信息办公室公告第十三批深度合成服务算法备案信息,思驰声音转换算法通过备案,这也是思驰第7项通过备案的算法,标志着思驰在人工智能算法合规化与场景落地能力上再次取得新的突破。
    的头像 发表于 09-18 14:05 707次阅读

    全国人大代表王锋一行莅临思驰调研

    日前,全国人大代表、致公党江苏省委会主委王锋一行深入人工智能领域领军企业思驰,围绕“以企业为主体贯通‘两个一公里’,健全全链条创新生态体系的政策举措”展开深度调研。思驰副总裁李春梅热情接待。
    的头像 发表于 08-26 09:53 742次阅读

    嵌入式工程师为什么要QT?

    Qt对嵌入式工程师来说,真的很重要吗? Qt是一个跨平台的C++应用程序开发框架,非常适合嵌入式系统的开发,Qt在嵌入式开发中具有很重要的作用。 在项目实践中可以看出,Qt在工业自动化
    发表于 08-14 15:15

    驰空调大模型解决方案

    这不是幻想,是基于思驰空调大模型解决方案发生的真实体验,该方案深度融合了思驰自研的全链路智能语音交互技术与对话式语言大模型DFM,它不仅能“听见”指令,更能“听懂”情绪,根据用户的习惯和喜好智能调节温度、风速、模式等,真正做到懂你所想。
    的头像 发表于 07-31 17:46 772次阅读

    【干货分享】基于QT和ffmpeg硬解码的多路摄像头取流

    前言其实官方为我们已经提供了三个官方实例,我打开学习了一下,QT实例虽然也用到了信号槽,是点击按钮的信号槽,我觉的QT妙就妙在了信号槽和多线程,而且官方的是QT5;多路摄像头取流案例使
    的头像 发表于 07-29 08:05 839次阅读
    【干货分享】基于<b class='flag-5'>QT</b>和ffmpeg硬解码的多路摄像头取流

    驰AI办公本亮相京东直播间

    近日,思驰董事长、CEO高始兴与思驰IOT事业部首席产品官马斌斌现身「京东3C数码采销」直播间,详细介绍并演示了思驰AI办公本的功能特点,并抽取了60个思驰AI全向会议麦克风M
    的头像 发表于 06-09 11:10 903次阅读

    基于RK3576开发板的QT GUI例程

    EASYEAI Orin-Nano开发板搭载了带有xfce桌面环境的Debian系统,支持Qt应用程序的开发和运行。开发板采用RK3576 CPU,性能强大,可直接在板上编译Qt应用程序,确保最佳
    的头像 发表于 05-14 10:26 1244次阅读
    基于RK3576开发板的<b class='flag-5'>QT</b> GUI例程

    EtherCAT运动控制器实时数据的Qt示波器

    基于QT开发调用正运动函数接口实现控制器数据实时监测的示波器效果
    的头像 发表于 04-17 17:12 594次阅读
    EtherCAT运动控制器实时数据的<b class='flag-5'>Qt</b>示波器

    【技术案例】Qt 环境部署 - Ubuntu 篇

    什么是QtQt是一个跨平台C++图形用户界面应用程序开发框架,可构建高性能的桌面、移动及Web应用程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成
    的头像 发表于 04-16 17:17 1513次阅读
    【技术案例】<b class='flag-5'>Qt</b> 环境部署 - Ubuntu 篇

    Qt Group发布Qt AI Assistant,助力跨平台UI开发

    为了进一步提升跨平台用户界面(UI)开发的效率与便捷性,Qt Group近日推出了一款实验性工具——Qt AI Assistant。这款工具的问世,标志着Qt Group在简化UI开发流程、减少
    的头像 发表于 02-07 13:47 1668次阅读

    Qt Group发布Qt Accelerate,加速数字产品开发进程

    Qt Group近日正式推出了Qt Accelerate,这是一款专为快速构建数字应用而设计的解决方案,旨在满足工业制造、移动出行、消费类电子等多个领域的需求。 Qt Accelerate基于
    的头像 发表于 01-13 11:19 946次阅读