写了很久QT 代码, 忽然对ui 到底是什么有了疑惑, 干脆认真研究一下ui 吧.
用QtCreator 点几下鼠标生成一个标准的QMainWindow 框架程序. 先来看看主要程序

$ cat mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}

ui 是什么?  ui 看起来是一个Ui::MainWindow 对象指针. 那Ui::MainWindow 又是什么呢?
且慢,再看看mainwindow.h 吧.

$ cat mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>//QT_BEGIN_NAMESPACE  // qt_begin_namespace 及 qt_end_namespace 这两个宏展开后为空,故也可以注释掉.
namespace Ui { class MainWindow; } //声明一个Ui空间的MainWindow类  注释该行, 会使19行出现: error: ‘Ui’ does not name a type
//QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

头文件中说明, ui 是一个Ui::MainWindow 的指针, 同时也说明Ui 是一个命名空间, 它下面有一个类叫MainWindow.
至于QT_BEGIN_NAMESPACE, QT_END_NAMESPACE 是2个空得宏, 仅起标识作用. 代码上已经注释了关键点.
又回到上个关键点: Ui::MainWindow 又具体是什么样子呢?
这是在ui_mainwindow.h 中定义的. 就是由mainwindow.ui 生成的头文件.


$ cat ui_mainwindow.h
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.14.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_MainWindow
{
public:QWidget *centralwidget;QMenuBar *menubar;QStatusBar *statusbar;void setupUi(QMainWindow *MainWindow){if (MainWindow->objectName().isEmpty())MainWindow->setObjectName(QString::fromUtf8("MainWindow"));MainWindow->resize(800, 600);centralwidget = new QWidget(MainWindow);centralwidget->setObjectName(QString::fromUtf8("centralwidget"));MainWindow->setCentralWidget(centralwidget);menubar = new QMenuBar(MainWindow);menubar->setObjectName(QString::fromUtf8("menubar"));MainWindow->setMenuBar(menubar);statusbar = new QStatusBar(MainWindow);statusbar->setObjectName(QString::fromUtf8("statusbar"));MainWindow->setStatusBar(statusbar);retranslateUi(MainWindow);QMetaObject::connectSlotsByName(MainWindow);} // setupUivoid retranslateUi(QMainWindow *MainWindow){MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));} // retranslateUi};namespace Ui {class MainWindow: public Ui_MainWindow {};
} // namespace UiQT_END_NAMESPACE#endif // UI_MAINWINDOW_H

从这个文件可以看出, Ui::MainWindow 类是Ui_MainWindow 的子类. 它公有继承于父类.
从而也继承了父类的2个函数setupUi, retranslateUi及其父类个各个对象指针. 这样Ui::MainWindow 对象
ui 就可以直接访问setUi 函数及直接使用其中的对象指针.
ui 对象是没有父类的, 所以new 出来的ui,需要用delete 来删除. 见MainWindow 的析构.
MainWindow 类, 和Ui::MainWindow 类是两个完全不同的类, 前面是一个继承于QMainWindow 的子类. 而后者
是一个由mainwindow.ui 生成的控件布局的类. 它们的名字都叫MainWindow 而有点容易混淆, 其实它们都可以
不叫MainWindow 而叫别的名字.
关键点就这么多了. 再补充一下main.cpp 吧, 这很简单. qt 框架.

$ cat main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

概括一下: ui 就是一个由若干组件构成一个独立的类,用以完成布局,它没有父类. setupUi传来的指针是各个控件的父对象. 所以 ui被new 出来,还是需要delete 来删除的.

Qt ui 到底是什么?相关推荐

  1. qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息

    qt ui指针和本类对象 重点 (Top highlight) 第1部分 (Part 1) So you're thinking about becoming a UX/UI designer, bu ...

  2. QT UI控件和事件

    QT UI控件和事件 控件 自定义事件 事件 QEvent 鼠标事件 定时器 绘图事件 文件 控件 登录窗口布局 lable : 标签 (登录的用户名:) Line Edit : 单行的编辑框 (输入 ...

  3. qt ui界面无法移动控件_使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能...

    已结贴√ 问题点数:20 回复次数:2 使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能 我做的是一个贪吃蛇游戏,现在我想实现的功能是:按下键盘上的上下左右箭头的方向按键时, ...

  4. qt ui框架_5个开源Python GUI框架

    您的Python程序需要图形用户界面吗?这里有五个工具可以帮助您构建一个. 在Python中,开始GUI编程的步骤并不十分复杂,但是它们确实需要用户开始做出一些选择.由于Python是一种通用编程语言 ...

  5. qt ui界面加入qsplitter_UI 文件设计与运行机制

    上一篇通过一个 "Hello World" 实例,演示了在 Qt Creator 里创建应用程序.设计窗体界面.编译和运行程序的基本过程.这一篇将介绍可视化设计的 UI 界面文件的 ...

  6. QT [007] QT UI 的控件操控问题 - 如何操控多嵌套的UI控件

    前言:QT 的多层叠和嵌套的控件有很多.我在实际尝试去尝试操控这项控件的是否,发现如何要找到一组控件里面的对象去操作,总是找不到方法,本文,将介绍如何解决这个问题. 我们看下面这个例子: ref: h ...

  7. 4:Qt Ui遇到高分屏字体显示问题

    目前高分屏越来越多,什么4k 8k牛逼死了,在高分屏下部分字体可能显示不正常,会出现显示不全的问题 在用Qt做UI的时候 注意,文字标签大小扩展策略不要用 Fixed 高分屏下字体显示不全,部分原因就 ...

  8. Qt UI界面美化教程1:【“飞扬青云” Qt精美控件】使用教程1

    文章目录 前言 控件预览 1. 控件下载 2. sdkdemo演示: 2.2 工程预览: 2.2 sdkdemo演示 3. 为QtDesigner安装控件 3.1 我们先为MSVC2017_32bit ...

  9. Qt .ui文件的使用

    .ui 文件其实就一个标准 XML 格式的文本文件(感兴趣的读者可以用记事本打开看看),需要通过 uic 工具将其转换为项目里可用的 ui_*.h 头文件, 这个头文件里才是真正可用的 C++ 代码. ...

  10. Qt - UI数据双向绑定简易实现

    文章目录 前言 原理 Qt 实现思路 源码 效果 一些想法 参考鸣谢 乍暖还寒时候,与上班提醒互道早安. 前言 自从前端大火了以后,UI数据双向绑定的ui框架愈发流行.作为前菜鸡安卓开发,我也是最近才 ...

最新文章

  1. tof摄像头手势识别_行业深度光学行业研究:CIS、光学元件、指纹识别、镜头模组...
  2. 年度编程语言最佳候选人:Kotlin vs. C
  3. Junit Hamcrest Eclemma
  4. 逻辑门电路的知识点归纳
  5. asp.net core WebAPI实现CRUD
  6. 100%移植阿里云移动测试技术,竟仅需1周?! ——移动测试专有云(1)
  7. 11 FI配置-财务会计-定义分类账和货币类型的设置
  8. 并查集——小米笔试题求朋友圈个数,分小组个数
  9. 电商如何“链”动新春,看聚划算助力“原年人”的好日子
  10. 电力电子课设日志(已完结)
  11. fluidsim元件库下载_FluidSIM下载
  12. win10系统迁移后系统重装_Windows10系统迁移后无法更新
  13. 使用Enum.Prase及Enum.TryPrase时的注意事项
  14. 为响应国家号召1+X证书Web前端开发最新考试模拟题
  15. SWUSTOJ82编写一个函数,求从n 个不同的数中取r 个数的所有选择的个数。
  16. 取消SVN感叹号即去除版本库
  17. 【OpenCV 例程 300篇】219. 添加数字水印(盲水印)
  18. 为什么说智能传感器必将引领时代前行?
  19. docker部署Sers
  20. java web相册_javaWEB实现相册管理的简单功能

热门文章

  1. bash, sh, dash 傻傻分不清楚
  2. 使用SpotBugs 进行代码检查
  3. LIO-SAM学习与运行测试数据集
  4. 不可或缺那就现在安排,22款奔驰GLE350升级ACC自适应巡航系统
  5. 自动删除微博【新版微博】
  6. rd640服务器引导,ThinkServer RD640 OS安装手册 V1.4.pdf
  7. CryEngine Plugin 创建
  8. zigbee PRO 事件
  9. 【网络实验箱02】-odl-neutron北向抓包分析
  10. Selenium 2自动化测试实战