【GUI开发基础】

GUI开发基础

  • 🌟项目文件组成
    • ✨浅析Pro文件配置
  • 🌟Qt设计师
  • 🌟剖析UI文件运行机制
  • 🌟UI设计方式
    • ✨可视化UI设计
    • ✨代码化UI设计

在这里插入图片描述

🌟项目文件组成

创建一个QtGUI项目:

  • open QtCreator —> select Creator Project —> select Application(Qt)/Qt Widgets Application —> fix Project Name and Project Path—> select Build System : qmake —> fix Qt UI Class Name and Base Class Name —> skip translation —> select Build Version —> Completed

完成一个GUI项目的创建,我可以在项目所在文件夹看到一个GUI项目的文件组成。
在这里插入图片描述

  • .pro文件:存储Qt项目设置的文件。
  • .pro.user文件:用于记录打开工程的路径,所用的编译器、构建的工具链、生成目录、打开工程的qt-creator的版本等。 当更换编译环境时,要将其删除
  • main.cpp文件:存放程序入口函数文件,里面通常只包含一个main函数。
  • mainwindow.cpp与mainwindow.h文件:是我刚刚创建的窗体类的源文件和头文件。
  • mainwindow.ui文件:一个XML格式存储的窗体上的元件及其布局的文件。

✨浅析Pro文件配置

//QT 字段后关联的是当前开发应用引入的QT模块,core gui是Qt用于GUI设计的类库模块,如果开发控制台程序就不用添加core gui
//pro文件中注释 使用‘#’
QT       += core gui
# sql					Qt提供的数据库模块
# network				Qt提供的网络模块
# xml					Qt提供的xml文件处理模块
# concurrent			Qt提供的一些高级工具,用于并发编程,特别是线程和进程管理。
# axcontainer			Qt提供的用于在应用程序中嵌入和管理ActiveX控件的模块。
# webenginewidgets		Qt提供的用于在应用程序中嵌入和显示Web内容的模块。
# multimedia			Qt提供的用于处理多媒体数据,包括音频、视频、图像等
# multimediawidgets		Qt提供的用于创建和处理多媒体小部件(widgets)的库//如果高于Qt版本,QT引入widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets//CONFIG 指定项目配置和编译器选项。这些值在内部通过Qmake识别,具有特殊的含义。
CONFIG += c++17
# c++11					支持C++11语法。
# c++17					支持C++17语法。
# release				当前项目已发布模式构建。
# debug					当前项目已调试模式构建。ps:如果指定了有多个构建模式,以最后一个为生效版本。
# debug_and_release		当前项目构建debug和release两种模式。ps:一般可以去除这个选项,不然生成的路径下会创建debug和release两个不同的文件夹
# debug_and_release_target 默认设置此选项。如果还设置了debug_and_release,则调试和发布构建最终会在单独的调试和发布目录中。
# build_all 			当前项目的debug和release版本都会被构建//定义项目名称 TARGET = GUIDemo//输出目录 $$PWD 表示PRO文件的位置   ./ 表示exe文件的位置
DESTDIR = $$PWD/../bin//库文件目录 用于引入库文件路径
INCLUDEPATH += \//依赖文件目录 
DEPENDPATH += \//SOURCES 引入当前项目需要构建的源文件
SOURCES += \main.cpp \mainwindow.cpp//HEADERS  引入当前项目需要构建的头文件
HEADERS += \mainwindow.h//FORMS 引入当前项目需要构建的UI文件
FORMS += \mainwindow.ui

🌟Qt设计师

  • 📗Qt设计师是一个用于设计和使用图形用户界面(GUI)的工具,它基于Qt部件(Widgets)进行工作。

  • 📕通过Qt设计师,用户可以以所见即所得的方式构建和定制自己的窗口(Windows)或对话框(Dialogs),并提供了不同的方法来测试它们。

  • 📘Qt设计师的核心优势在于其强大的信号-槽机制,能够无缝地将由Qt设计师创建的部件或窗体与手工编写的代码整合在一起,从而轻松地为图形元素定义行为

  • 📙此外,Qt设计师设置的所有属性均可以在代码中动态地修改,增加了其灵活性和可扩展性

  • 📓QtCreator这个IDE中已经集成了Qt设计师在其中,用户可以通过(快捷键Shift+F4)编辑窗口类的.ui文件来进入UI设计师界面。此外,QtCreator提供了独立的Qt设计师应用,方便用户在Visual Studio上通过Qt设计师来开发Qt图形界面。

下图是Qt设计师界面:
在这里插入图片描述

  • 布局和界面设计工具栏:窗口上方的一个工具栏,工具栏的按钮主要实现布局和界面设计。
  • 对象浏览器(Object Inspector):窗口右上方的是Object Inspector,用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件的对象名称和类名称。
  • 属性编辑器(Property Editor):窗口右下方是属性编辑器,是界面设计时最常用到的编辑器。属性编辑器显示某个选中的组件或窗体的各种属性及其取值,可以在属性编辑器里修改这些属性的值。(PS:1.属性编辑器是按照组件的继承关系来展示属性值配置的。2.组件的属性值还可以在程序运行时来动态配置,通过代码来进行UI设计。)

🌟剖析UI文件运行机制

项目中的窗口类是如何与UI文件绑定的?

📖mainwindow.h解析

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>//这里通过Qt的宏定义了Ui命名控件,你会发现Ui的类名竟然和窗口类的名称相同,这里的类名并不是当前类的名称
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:
//这里定义了一个指针,指向可视化设计的界面,在当前类中访问绑定的UI类的组件,都需要通过这个指针ui来访问。Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

📖mainwindow.cpp解析

#include "mainwindow.h"
#include "ui_mainwindow.h"//这个文件在我们创建项目时并没存在,它是在qmake编译项目时才会生成。//执行父类QMainWindow的构造函数,创建Ui:MainWindow类的对象ui。这ui就是MainWindow中private部分定义的指针变量ui。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
//执行了Ui:MainWindow类的setupUi()函数,这个函数实现窗口的生成与各种属性的设置、信号与槽的关联。ui->setupUi(this);
}MainWindow::~MainWindow()
{
//简单地删除用new创建的指针ui。delete ui;
}

📖mainwindow.ui解析

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"/><widget class="QMenuBar" name="menubar"/><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>
//定义了窗口类中所有组件的属性、布局信息。

📖ui_mainwindow.h解析

/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** 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.h文件的内容,发现它主要做了下面一些工作:

  1. 定义了一个Ui_MainWindow类,用于封装可视化设计的界面。
  2. 自动生成了界面各组件的类成员变量定义。在public部分为界面上每个组件定义了一个指针变量,变量的名称就是用户自定义的ObjectName。
  3. 定义了setupUi()函数,这个函数用于创建各个界面组件,并设置其位置、大小、文字内容、字体等属性,设置信号与槽的关联。

接下来,setupUi() 调用了函数 retranslateUi(MainWindow),用来设置界面各组件的文本内容属性,如标签的文字、按键的文字、窗体的标题等。将界面上的文字设置的内容独立出来作一个函数retranslateUi (),在设计多语言界面才会用到这个函数。(PS:在使用Qt提供的语言家设计多语言版本时,可以为界面中所有控件的文本重新命名。)

在这里插入图片描述

🌟UI设计方式

在Qt Creator中,UI设计主要分为两种方式:可视化UI设计和代码化UI设计。这两种方法各有优点,适用于不同的开发需求和场景。

✨可视化UI设计

📘可视化UI设计是通过Qt Creator内置的图形化设计工具(Qt Designer)来创建用户界面的方式。开发者可以直接拖放控件到窗体上,调整属性和布局,而无需编写代码。
这种方法通常涉及以下步骤

  1. 拖放控件:从工具箱中拖放各种UI控件(如按钮、标签、文本框等)到设计窗口。
  2. 设置属性:通过属性编辑器调整控件的属性,如大小、位置、文本、颜色等。
  3. 布局管理:使用布局管理器(如水平布局、垂直布局、网格布局等)组织控件,以确保界面在不同窗口大小下的自适应。
  4. 信号与槽:在设计器中连接控件的信号与槽,实现控件之间的交互。

👍优点

  1. 直观性强:通过图形化界面,设计过程更加直观和可视化。
  2. 效率高:无需编写大量的UI代码,设计速度快。
  3. 易于调整:可以直接在设计器中调整和查看UI效果。

👎缺点

  1. 灵活性有限:对于一些复杂的界面和动态生成的控件,可能不如代码化设计灵活。
  2. 学习成本:需要熟悉Qt Designer的使用。

✨代码化UI设计

📘代码化UI设计是通过编写代码来创建和管理用户界面的方式。开发者使用Qt的C++或Python(通过PyQt或PySide)来手动定义控件、布局和交互逻辑。
这种方法通常涉及以下步骤

  1. 定义控件:在代码中创建UI控件对象(如QPushButton、QLabel等)。
  2. 设置属性:通过代码设置控件的属性,如文本、大小、位置等。
  3. 布局管理:使用布局管理器对象(如QHBoxLayout、QVBoxLayout等)组织控件。
  4. 信号与槽:通过代码连接控件的信号与槽,实现交互逻辑。

👍优点

  1. 灵活性强:可以实现高度自定义和复杂的UI设计,适合动态生成控件的场景。
  2. 可维护性:对于习惯代码化管理的开发者,更容易进行版本控制和代码管理。
  3. 更强的控制:开发者可以对控件的创建和管理进行精细控制。

👎缺点

  1. 开发速度慢:需要编写大量的代码,初期开发速度较慢。
  2. 复杂性高:对于大型界面和复杂布局,代码化设计可能更加繁琐。

综合考虑
在实际开发中,很多开发者会综合使用这两种方法。例如,可以通过可视化UI设计快速创建初始界面,然后在代码中进行进一步的自定义和逻辑处理。这样既能提高开发效率,又能保证灵活性和可维护性。对于简单和标准化的界面设计,可视化UI设计更为合适;而对于需要高度定制和动态生成的界面,代码化UI设计则更为适用。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

You must call removeView() on the child‘s parent first.异常分析及解决

问题描述 对试图组件快速的左右滑动过程&#xff0c;发现某一张图片没加载出来&#xff0c;偶现crash 问题分析 view在上次已经是某个ParentView的child&#xff0c;然而现在又把它做为另外一个view的child&#xff0c;于是出现一个view有两个parent。所以就产生了这个错误。…

创新工具|AI革新内容营销:策略、工具与实施指南

探索如何利用人工智能&#xff08;AI&#xff09;提升内容营销策略&#xff0c;从SEO优化到个性化推荐。本指南详细介绍了11款顶尖AI工具&#xff0c;旨在帮助中国的中高级职场人士、创业家及创新精英高效地策划和生成引人入胜的内容&#xff0c;同时确保内容的专业性、权威性和…

2.OpenFeign 入门与使用

2.OpenFeign 入门与使用 1.什么是 OpenFeign?2.OpenFeign 基础使用2.1 添加依赖2.2 配置 Nacos 服务端信息2.3 项目中开启 OpenFeign2.4 编写 OpenFeign 调用代码2.5 调用 OpenFeign 接口代码 3.超时重试机制3.1 配置超时重试3.2 覆盖 Retryer 4.自定义超时重试机制4.1 自定义…

golang通过go-aci适配神通数据库

1. go-aci简介 go-aci是神通数据库基于ACI(兼容Oracle的OCI)开发的go语言开发接口&#xff0c;因此运行时需要依赖ACI驱动和ACI库的头文件。支持各种数据类型的读写、支持参数绑定、支持游标范围等操作。 2. Linux部署步骤 2.1. Go安装&#xff1a; 版本&#xff1a;1.9以上…

【从C++到Java一周速成】章节14:网络编程

章节14&#xff1a;网络编程 【1】网络编程的概念【2】IP地址与端口的概念【3】网络通信协议引入网络通信协议的分层 【3】Socket套接字【4】单向通信【5】双向通信 【1】网络编程的概念 把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网…

头歌openGauss-存储过程第2关:修改存储过程

任务描述 本关任务&#xff1a; 修改存储过程pro0101&#xff0c;并调用&#xff1b; --修改sel_course表中成绩<60的记录为成绩10&#xff0c;然后将计算机学院所有学生的选课成绩输出&#xff1b; --a、需要先删除存储过程pro0101&#xff1b; drop procedure if exists p…

LLM 入门与实践(三)Baichuan2 部署与分析

本文截取自20万字的《PyTorch实用教程》&#xff08;第二版&#xff09;&#xff0c;敬请关注&#xff1a;《Pytorch实用教程》&#xff08;第二版&#xff09;《Pytorch实用教程》&#xff08;第二版&#xff09;无论是零基础入门&#xff0c;还是CV、NLP、LLM项目应用&#x…

Python协程的作用

过分揣测别人的想法&#xff0c;就会失去自己的立场。大家好&#xff0c;当代软件开发领域中&#xff0c;异步编程已成为一种不可或缺的技术&#xff0c;用于处理大规模数据处理、高并发网络请求、实时通信等应用场景。而Python协程&#xff08;Coroutine&#xff09;作为一种高…

【译】MySQL 组复制 - 部分网络故障对性能的影响

原文地址&#xff1a;MySQL Group Replication – Partial Network Failure Performance Impact 在这个由两部分组成的博客系列中&#xff0c;我想介绍一些使用组复制的故障转移场景。在第一部分中&#xff0c;我将讨论我在撰写这些文章时发现的一种有趣的行为和性能下降。在第…

C#学习指南:重要内容与实用技巧

学习C#编程是一段充满挑战但又非常充实的旅程。以下是我在学习过程中积累的一些经验&#xff0c;希望能对大家有所帮助。 一、掌握基础概念 类及其成员 C#中的类是编程的基础模块。理解类的结构、属性、方法和构造函数是至关重要的。每个类都有其特定的功能&#xff0c;学会如…

力扣HOT100 - 169. 多数元素

解题思路&#xff1a; 有点类似于Boyer-Moore 投票算法&#xff0c;但更加形象。 class Solution {public int majorityElement(int[] nums) {int winner nums[0];int cnt 1;for (int i 1; i < nums.length; i) {if (winner nums[i]){cnt;} else if (cn…

景源畅信数字:抖音小店新手该怎么做?

在数字化时代的浪潮中&#xff0c;抖音不仅仅是一个分享短视频的平台&#xff0c;更是一个充满潜力的电商平台。对于想要进入这个领域的朋友们来说&#xff0c;开设一家抖音小店无疑是一个既激动又迷茫的起点。那么&#xff0c;作为新手&#xff0c;该如何在这个全新的舞台上立…

【Linux】信号之信号的产生详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误的话&#xff0c;还望指出&…

vue核心模块源码解析

响应式原理 Object.definePropertysetterProxy var count 1 var state {} Object.defineProperty(state , count,{get(){return count},set(val){count val} }) //弊端&#xff1a;不能主动监听到对象属性的新增或者删除&#xff0c;add/deleteref和reactive 声明响应式数…

翻译《The Old New Thing》- How do I mark a shortcut file as requiring elevation?

How do I mark a shortcut file as requiring elevation? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071219-00/?p24103 Raymond Chen 2007年12月19日 如何将快捷方式标记为需要提升权限 简要 文章介绍了如何通过设置SLDF_RUNAS_US…

许冉直播不治本,京东需要刘强东

图片&#xff5c;影视剧《纸牌屋》剧照 ©自象限原创 作者丨艾AA 编辑丨薛黎 这届618&#xff0c;消费者的热情还未显现&#xff0c;商家的怒火先爆发了。 5月21日京东618开幕次日&#xff0c;多家图书社抵制618图书大促登上了热搜。此次争议与去年双十一京东采销与电…

移动端h5适配方案:媒体查询、编写js、lib-flexible、vw、rem和vw单位换算

文章目录 各种方案第二种&#xff1a;动态设置html的font-size媒体查询mediajs 第三种&#xff1a;vw方案 rem、vw单位换算手动根据设计稿进行计算lessvs code 插件 各种方案 1&#xff09;百分比设置&#xff08;X&#xff09;【百分比很难统一&#xff0c;不推荐】 2&#xf…

安卓高级控件(下拉框、列表类视图、翻页类视图、碎片Fragment)

下拉框 此小节介绍下拉框的用法以及适配器的基本概念&#xff0c;结合对下拉框Spinner的使用说明分别阐述数组适配器ArrayAdapter、简单适配器SimpleAdapter的具体用法与展示效果。 下拉框控件Spinner Spinner是下拉框控件&#xff0c;它用于从一串列表中选择某项&#xff0…

Java与GO语言对比分析

你是不是总听到go与java种种对比&#xff0c;其中在高并发的服务器端应用场景会有人推荐你使用go而不是 java。 那我们就从两者运行原理和基本并发设计来对比分析&#xff0c;看看到底怎么回事。 运行原理对比 java java 中 jdk 已经帮我们屏蔽操作系统区别。 只要我们下载并…

Android中华为手机三态位置权限申请理解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家&#xff0c; &#x1f449;点击跳转到教程 前言&#xff1a; 使用的华为MATE 20,Android10的系统。 <!--精准定位权限&#xff0c;如&#xff1a;…