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

    文章

    4557

    浏览量

    66822
  • Qt
    Qt
    +关注

    关注

    1

    文章

    299

    浏览量

    37340
  • 矩形
    +关注

    关注

    0

    文章

    15

    浏览量

    12577

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

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

收藏 人收藏

    评论

    相关推荐

    Qt上位机开发实战案例

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

    3562-Qt工程编译说明

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

    TLT507-Qt工程编译说明

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

    QT串口通信的简单使用

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

    Rust GUI实践之Rust-Qt模块

    Rust-Qt 是 Rust 语言的一个 Qt 绑定库,它允许 Rust 开发者使用 Qt 框架来创建跨平台的图形界面应用程序。Qt 是一个跨平台的应用程序框架,它提供了一系列的工具和
    的头像 发表于 09-30 16:43 973次阅读

    峰会回顾第29期 | Qt For OpenHarmony

    演讲嘉宾 | 蔡万苍 回顾整理 | 廖   涛 排版校对 | 李萍萍 嘉宾简介 蔡万苍,13年C++/Qt开发相关工作经验,曾任职Qt公司,担任技术支持、Qt咨询师,协助国内多家Qt
    的头像 发表于 09-07 08:45 631次阅读
    峰会回顾第29期 | <b class='flag-5'>Qt</b> For OpenHarmony

    搭建一种跨平台qt5远程编译环境

    所谓的跨平台qt5远程编译环境,就是实现在本机的VS上写Qt程序,然后在远程的linux机器上进行编译,得到Qt的Gui或非GUI程序。
    的头像 发表于 07-25 15:05 734次阅读
    搭建一种跨平台<b class='flag-5'>qt</b>5远程编译环境

    Qt for MCUs 快速入门指南

    Qt for MCUs 快速入门指南
    发表于 06-30 19:16 1次下载
    <b class='flag-5'>Qt</b> for MCUs 快速入门指南

    在 Raspberry Pi上安装 QT

    Qt开发环境 1.同步更新源 sudo apt-get update 2.安装qt5开发环境 sudo apt install qtbase5-dev qtchooser qt
    的头像 发表于 05-26 19:00 364次阅读
    在 Raspberry Pi上安装 <b class='flag-5'>QT</b>

    Windows下的QT系统开发环境搭建

      QT是一款由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。 它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。 Qt是面向对象的框架,使用特殊的代码
    的头像 发表于 05-17 11:39 2267次阅读
    Windows下的<b class='flag-5'>QT</b>系统开发环境搭建

    Qt之上位机开发实战(一)

    一、Qt三大金刚 1、qt下的串口编程 2、qt下的网络编程 3、qt下的GPIO 本章节先介绍一下qt下的串口编程,首先我们新建一个Wid
    发表于 05-10 11:35 2次下载
    <b class='flag-5'>Qt</b>之上位机开发实战(一)

    基于Qt的简单arduino上位机

    准备工作 一块esp8266,安装arduinoIDE、Qt、navecate、mysql/**若没有mysql可直接采用sqllist。 QT上位机 通信协议采用UDP(TCP同理),通过ip地址与端口实现数据获取与显示,主要用到socket。
    发表于 05-09 10:36 2次下载
    基于<b class='flag-5'>Qt</b>的简单arduino上位机

    基于QT的简单的上位机

    一、前言大家好,我是ZhengN,本次来教大家编写一个基于QT的简单的上位机。学习一个新的东西我们都从最基础地实例开始,比如学习C语言我们会从编写一个hello程序开始、学习嵌入式我们从点灯开始
    发表于 05-08 10:57 16次下载
    基于<b class='flag-5'>QT</b>的简单的上位机

    QT|编写一个简单的上位机

    QT | 编写一个简单的上位机 时间 :2023-03-19文章目录QT | 编写一个简单的上位机 参考及资料: 1.打开`QT Creator` 2.新建工程 3.上位机界面设计 3-1.界面布局
    发表于 05-08 10:12 2次下载
    <b class='flag-5'>QT</b>|编写一个简单的上位机

    QTQT上位机串口编程

    QTQT上位机串口编程 最近因为项目需要,需要用到上位机,通过串口与上位机进行通讯,来上传和下发一些数据以及控制指令,所以用QT写了一个上位机,并记录下来,免得到时候要用又到处翻资料。
    发表于 05-08 10:02 20次下载
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b>上位机串口编程