Qt修炼手册9_Ui名字空间及setupUi()原理解读

2023-12-02 11:58

本文主要是介绍Qt修炼手册9_Ui名字空间及setupUi()原理解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前言

用最新的QtCreator选择GUI的应用会产生含有如下文件的工程:

1.1 *.pro文件

QT      += core gui  //使用Qt的Core和Gui模块。QT将自己的库函数分为多个模块,最常用的是QtCore, QtGui。如果使用                      //其他的模块的话可以添加其他模块。常用的有QtNetwork,QtOpenGl, QtSql, QtXml. QtWebkit等等                      //如果应用程序使用到该模块,需要添加相应的模块。
TARGET   = test0831  //生成的应用程序或者链接库的名字     
TEMPLATE = app       //工程的类型,一般有app和lib,app就是直接的应用程序,lib就是动态链接库,一般用于插件开发SOURCES += main.cpp\ //就是*.cpp文件列表,多行显示的时候用\mainwindow.cppHEADERS  += mainwindow.h //*.h文件列表FORMS    += mainwindow.ui //UI文件的列表,UI文件是Qt特有的界面设计文件

1.2 mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_
该文件是类的声明文件。符合主流的OOP的面向接口编程的思想。一般将类的定义都在此文件中。一般不再该文件中定义操作。注意继承自Qt的内部文件,一定在类中加上Q_OBJECT的宏定义,Qt会使用MOC将改文件重新编译成moc_mainwindow.cpp文件,这个才是原始的C++类的文件。所以Qt内置的类文件都不是原生态的C++类,需要Qt编译器再处理,所以继承子Qt的类一定要添加该宏定义,否则编译一定不通过。
Ui::MainWindow* ui 变量声明是mainwindow.ui生成的布局类Ui::MainWindow.

1.3 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;
}
是类的定义文件。注意#include “ui_mainwindow.h". 工程中的mainwindow.ui文件会被UIC编译生成ui_mainwindow.h。文件中的类就是Ui::MainWindow。MainWindow中的ui就是用布局类初始化。之后在构造函数需要使用ui->setupUI(this);就可以将Ui::MainWindow中的布局应用到本地的MainWindow

1.4 mainwindow.ui布局文件 

其中的内容是xml格式的标记文件,这点和主流的UI设计相符,现在主流的UI设计如Andriod和WP都是使用XML文件做UI设计,可以使用Qt SDK自带的Qt Designer进行可视化设计,设计好的*.ui文件可以直接在工程文件中使用。主要.pro中FORMS中添加对应的文件名,*.cpp文件中加入#include "ui_*.h"文件名。初始化之后就可以将布局建立在自己的类中。

2.一定要理解ui_mainwindow.h

这个UI的头文件是原始项目编译后生成的,这个里面会涉及到真正布局用的函数,也就是那个Ui域中的MainWindow。看下面代码:
#ifndef UI_MAINWINDOW_H  
#define UI_MAINWINDOW_H  #include <QtCore/QVariant>  
#include <QtGui/QAction>  
#include <QtGui/QApplication>  
#include <QtGui/QButtonGroup>  
#include <QtGui/QHeaderView>  
#include <QtGui/QMainWindow>  
#include <QtGui/QMenuBar>  
#include <QtGui/QStatusBar>  
#include <QtGui/QToolBar>  
#include <QtGui/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow  
{  
public:  QMenuBar *menuBar;  QToolBar *mainToolBar;  QWidget  *centralWidget;  QStatusBar *statusBar; void setupUi(QMainWindow *MainWindow)  {  if (MainWindow->objectName().isEmpty())  MainWindow->setObjectName(QString::fromUtf8("MainWindow"));  MainWindow->resize(600, 400);  menuBar = new QMenuBar(MainWindow);  menuBar->setObjectName(QString::fromUtf8("menuBar"));  MainWindow->setMenuBar(menuBar);  mainToolBar = new QToolBar(MainWindow);  mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));  MainWindow->addToolBar(mainToolBar);  centralWidget = new QWidget(MainWindow);  centralWidget->setObjectName(QString::fromUtf8("centralWidget"));  MainWindow->setCentralWidget(centralWidget);  statusBar = new QStatusBar(MainWindow);  statusBar->setObjectName(QString::fromUtf8("statusBar"));  MainWindow->setStatusBar(statusBar);  retranslateUi(MainWindow);  QMetaObject::connectSlotsByName(MainWindow);  } // setupUi  void retranslateUi(QMainWindow *MainWindow)  {  MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));  Q_UNUSED(MainWindow);  } // retranslateUi  
};  namespace Ui {  class MainWindow: public Ui_MainWindow {};  
} // namespace Ui  QT_END_NAMESPACE  
#endif // UI_MAINWINDOW_H 
吼吼,一下子多了不少,但其实还是很容易的。Ui_MainWindow声明了几个构件,具体我就不说了,因为也没啥可说的,它实现了setupUi函数,也就是前面那个MainWindow中调用的setupUi。

但是要说明的是QMetaObject::connectSlotsByName()函数会自动连接相应名称的信号与槽,但要注意它连接的是传入的MainWindow及其子构件【不是子类】,注意前边ui->setupUi(this)中传入的this,也就是非ui域中的MainWindow,所以如果要声明signal和slot时还是要在非ui域的MainWindow中来声明,然后通过ui->xxx的形式来与GUI产生交互!如果我们在QtDesiner中拖放一个按钮然后点击go to slot就很容易印证这一点。

retranslateUi则会为ui中的构件命名,具体也不在此多说。

我们需要着重讨论的是,下面代码。并思考,编译完Designer后,产生一个布局可以理解,怎么还多了一个命名空间?
namespace Ui {  class MainWindow: public Ui_MainWindow {};  
} // namespace Ui 
前面非Ui域中的MainWindow的*ui( UI::MainWindow *ui)指向的是Ui域中的MainWindow,而Ui域中的MainWindow( 上边那行代码)继承Ui_MainWindow

3.到底什么是UI?

ui通常是用Qt 设计师设计出来的界面文件的后缀。通常情况下ui是一个指向这个界面类的指针。“ui->”一般就是用来访问这个界面类里面的控件。
例如我们的ui文件里有一个叫OkButton的QPushButton。我们可以这样来访问这个按钮ui->OkButton。setupUi(this)是由.ui文件生成的类的构造函数,这个函数的作用是对界面进行初始化,
它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来。也可以说,setupUi 是我们画界面和写程序之间的桥梁

这篇关于Qt修炼手册9_Ui名字空间及setupUi()原理解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445249

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2