当前位置: 首页 > news >正文

【QT】1.QT 基础入门 - 实践

【QT】1.QT 基础入门 - 实践

目录

一、新建项目

1. 新建项目

二、生成代码

1. main.cpp

2. widget.h / widget.cpp

3. widget.ui

4. .pro 文件

5. 运行后生成的文件

三、创建控件

1. Label(标签)

2. 编辑框

3. 一个简单的交互程序:点击按钮切换文字

四、乱码问题与文字输出

1. 编码问题

2. qDebug 输出

五、坐标系统


一、新建项目

1. 新建项目

  1. 启动:在 QT 的安装文件夹中,找到并运行 QT Creator,然后在左上角的“文件”菜单中点击“新建”。

  2. 选择模板:由于 QT 支持 Python 等多种语言开发,QT Quick 是 QT 自己的一套声明式语言和开发方式。我们使用 C++,因此选择默认的 Widgets Application 模板即可。

  3. 设置项目路径和名字:路径和名称不能包含中文。

  4. 构建系统选择:选择 qmake,这是 QT 的经典构建工具。CMake 也被部分开源项目使用,而 Qbs 已停止维护。​​​​​​​

  5. UI 文件(Formfile)

    • 在 QT 中创建图形界面的方式有两种:使用 C++ 代码创建,或使用 Formfile 图形界面创建。

    • 我们选用图形化方式快速编辑。​​​​​​​

    • 基类选择 QWidget。​​​​​​​

  6. 其他选项:编译器选择等保持默认即可。

二、生成代码

1. main.cpp

#include "widget.h"
#include 
int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

创建 QT 项目后,会自动生成这些代码。

  1. main 函数的形参即为命令行参数。

  2. QApplication:是编写 QT 应用程序时必须的类,管理应用程序的控制流和主要设置。

  3. show 方法

    • Widget w;

    • w.show();

    • Widget 是创建项目时输入的类名。

    • .show() 用于显示窗口控件,改为 .hide() 则为隐藏。

  4. exec 方法:与 Linux 的 exec 不同,这是启动应用程序的事件循环,让程序运行起来。

2. widget.h / widget.cpp

  1. 继承关系class Widget : public QWidget,即继承了创建项目时选择的基类 QWidget

  2. Q_OBJECT 宏:QT 内置的宏,展开后会生成一些代码,是 QT 信号和槽机制的核心所需。

  3. 构造函数和析构函数:​​​​​​​

  4. Ui::Widget *ui;:这个指针与 .ui 文件(Formfile)密切相关,用于访问界面上的控件。

3. widget.ui

  • 双击该文件会调用 QT Designer,打开图形化编辑器,可以从左侧拖拽控件到界面上。

  • 返回代码编辑区可以看到其格式,本质上是 XML 文件。​​​​​​​

  • 这个区域已经被封装好了,我们只需运行程序即可看到界面。

4. .pro 文件

  • 这是 QT 的工程文件。

  1. QT += core gui:指定项目需要引入的 QT 模块。

  2. SOURCES, HEADERS, FORMS:这些部分列出了项目中的源文件、头文件和界面文件。通常不需要手动修改,QT Creator 会自动维护。

5. 运行后生成的文件

  • 运行项目后,会生成一个 build- 开头的文件夹。

  • ui_widget.h 是由 widget.cpp 里的 setupUi 调用(ui->setupUi(this);)所创建的。

  • 它根据 .ui 文件生成了具体的界面设置代码。

三、创建控件

1. Label(标签)

  1. 图形化创建

    • 在 widget.ui 中拖拽 Label 到界面上即可。​​​​​​​

    • 此时,在 widget.ui 文件里就会有一个 QLabel 标签。​​​​​​​

  2. 代码创建

    • 在 widget.cpp 的构造函数中创建。

    • 在 main 函数中有 Widget w; 这一行,创建 Widget 对象时就会调用构造函数,从而创建出画面。

    • 添加头文件:#include <QLabel> (QT 历史较早,有 .h 和没有 .h 的头文件都存在,两者都可以)。

    • 创建对象并指定父对象:

      QLabel* q1 = new QLabel(this); // this 就是 Widget w,给这个标签指定父对象
      q1->setText("Hello World");

    • QT 有自己封装的字符串类 QString。开发时 std::string 和 QString 都可以用,但 QString 在处理编码(尤其是中文)时更友好。

    • 注意:这里没有 delete 不会造成内存泄露。

      • 原因:QT 使用对象树机制,当父对象(Widget)被销毁时,会自动销毁其所有子对象(如这里的 q1)。

    • 如果将 QLabel 对象创建在栈上(如 QLabel q1(this);),在构造函数结束时它就会立即销毁,导致无法显示。​​​​​​​

2. 编辑框

  • 单行编辑框QLineEdit

  • 多行编辑框QTextEdit

  • 图形化实现:拖拽 Line Edit 控件到界面上即可。

  • 代码实现

    cpp

    QLineEdit* q = new QLineEdit(this);
    q->setText("hello world");

3. 一个简单的交互程序:点击按钮切换文字

  1. 图形界面实现

    • 拖拽一个 Push Button 到界面上。

    • 使用 connect 函数连接信号与槽:

      cpp

      connect(ui->pushButton, &QPushButton::clicked, this, &Widget::changeText);
      • ui->pushButton 代表按钮的对象名(可以在界面右侧的属性编辑器中修改)。​​​​​​​

      • &QPushButton::clicked 表示接收按钮的“被点击”信号。

      • this 代表接收信号的对象(当前 Widget)。

      • &Widget::changeText 代表接收到信号后要执行的操作(槽函数),需要在 Widget 类中实现。

    • 实现槽函数 changeText

      cpp

      void Widget::changeText() {if (ui->pushButton->text() == QString("hello world"))ui->pushButton->setText("hello qt");elseui->pushButton->setText("hello world");
      }
  2. 使用 Lambda 表达式一步搞定

    connect(ui->pushButton, &QPushButton::clicked, this, [this]() {if (ui->pushButton->text() == QString("hello world"))ui->pushButton->setText("hello qt");elseui->pushButton->setText("hello world");
    });

  3. 纯代码实现

    • 首先,在 widget.h 的 Widget 类中添加成员变量:QPushButton* pushButton;

    • 在 widget.cpp 的构造函数中创建并连接:

      pushButton = new QPushButton(this);
      connect(pushButton, &QPushButton::clicked, this, &Widget::changeText);

    • 实现 changeText 槽函数(与图形化实现中的函数体类似,只是将 ui->pushButton 换成 pushButton)。

四、乱码问题与文字输出

1. 编码问题

  • 计算机中汉字占用的字节数取决于编码格式:GBK 为 2 字节,UTF-8 为 3 字节。

  • Windows 系统默认使用 GBK 编码,Linux 系统默认使用 UTF-8 编码。

  • QT 默认使用 UTF-8 编码。如果源文件编码不一致,可能会导致中文显示乱码。

2. qDebug 输出

  • qDebug() 可以自动处理编码问题,方便地输出调试信息。

    qDebug() << "你好" << '\n';
  • 此外,qDebug 还可以通过宏定义等方式统一关闭所有调试信息的打印,便于发布。

五、坐标系统

  • QT 使用左手系坐标:Y 轴向下为正方向,X 轴向右为正方向。

  • QWidget 设置位置(如使用 move 函数)时,坐标是相对于其父控件(父窗口)的,(0, 0) 点就是父窗口的左上角。

http://www.jsqmd.com/news/383806/

相关文章:

  • Qwen3-ASR-1.7B惊艳效果展示:高校学术讲座中专业公式读法、文献引用准确转写
  • StructBERT文本相似度模型5分钟上手:中文语义匹配实战教程
  • Buck Converter MATLAB_help文档DeepSeek翻译
  • MedGemma X-Ray多场景落地:已接入12家医学院校AI医学教育实验平台
  • 科学修复,温和赋能|武汉普拉提康复课程,禧悦守护每一份身心安康 - 冠顶工业设备
  • Seedance 2.0一致性引擎深度拆解:3大核心约束(时空锚点/光流校准/语义帧对齐)如何解决97.3%的跨镜头跳变问题?
  • yz-bijini-cosplay功能体验:一键生成多种风格图片
  • Seedance 2.0一致性引擎深度拆解:从光流对齐误差<0.3px到跨镜头ID连续性99.7%的7步工业级调优路径
  • 手把手教你用HY-Motion 1.0制作专业级角色动画
  • Seedance 2.0多镜头一致性实战避坑手册:从帧同步失效到语义漂移,97%项目踩过的4个隐性逻辑断点全解析
  • StructBERT-Large效果展示:教育领域作文题目相似性分析——‘我的家乡’与‘我爱我的故乡’匹配度87.4%
  • 【Seedance 2.0多镜头一致性实战白皮书】:20年CV架构师亲授3大核心逻辑、5类典型崩坏场景与实时修复SOP
  • BH钜勋健身器材落地指南:选对服务商,让商用健身场景更具竞争力 - 冠顶工业设备
  • Seedance 2.0源码级拆解:3大一致性引擎(时空对齐/特征锚定/梯度协同)如何实现99.2%跨镜头ID保持率?
  • 一键去除背景!RMBG-2.0镜像实战:人像抠图保姆级指南
  • 【Seedance 2.0多镜头一致性权威白皮书】:20年视觉算法专家亲授3大核心逻辑与5类典型崩坏场景修复指南
  • Qwen3-ASR-0.6B评测:支持粤语的多语言识别神器
  • 【Seedance 2.0 多镜头一致性逻辑深度解析】:20年CV架构师亲授工业级跨视角同步实现原理与避坑指南
  • Seedance 2.0多镜头一致性报错全链路解析:从时间戳偏移、位姿解算漂移到特征匹配断裂,5步精准归因+4行代码修复
  • 2026光伏功率预测:云来了掉得更狠?不是云量问题,是“云速”没指标化!风场×地形决定落坡斜率(附工程落地代码)
  • 324. Java Stream API - 实现 Collector 接口:自定义你的流式收集器
  • Seedance 2.0多镜头一致性配置全链路拆解:从标定误差归因到时序同步调优,3类致命配置陷阱避坑手册
  • AI助手专业能力评估实战:构建多维度Agent Skills度量体系
  • 构建未来教育新生态:智慧校园平台方案关键模块建设浅析
  • 2026年,银川口碑搬家公司推荐:行业分析+避坑指南+尖兵搬家全解析 - 宁夏壹山网络
  • 【Seedance 2.0多镜头一致性逻辑调优白皮书】:20年视觉算法专家亲授3大瓶颈突破法+实测性能提升47.8%关键路径
  • Seedance 2.0多镜头一致性逻辑性能翻倍指南:5个被90%团队忽略的GPU内存对齐技巧与帧同步时序优化
  • [论文阅读] AI + 软件工程 | 33k+ AI编码PR实证揭秘:为什么AI提交的代码常被拒绝?深度解析:原理、实战与踩坑记录
  • 【Seedance 2.0多镜头一致性权威指南】:20年视觉算法专家亲授5步精准配置法,97%用户首次部署即通过一致性校验
  • SiameseUIE中文-base实战手册:从CSDN GPU Pod访问到Web界面全链路验证