目录
[1. 新建项目](#1. 新建项目)
[1. main.cpp](#1. main.cpp)
[2. widget.h / widget.cpp](#2. widget.h / widget.cpp)
[3. widget.ui](#3. widget.ui)
[4. .pro 文件](#4. .pro 文件)
[5. 运行后生成的文件](#5. 运行后生成的文件)
[1. Label(标签)](#1. Label(标签))
[2. 编辑框](#2. 编辑框)
[3. 一个简单的交互程序:点击按钮切换文字](#3. 一个简单的交互程序:点击按钮切换文字)
[1. 编码问题](#1. 编码问题)
[2. qDebug 输出](#2. qDebug 输出)
一、新建项目

1. 新建项目
-
启动 :在 QT 的安装文件夹中,找到并运行
QT Creator,然后在左上角的"文件"菜单中点击"新建"。
-
选择模板 :由于 QT 支持 Python 等多种语言开发,
QT Quick是 QT 自己的一套声明式语言和开发方式。我们使用 C++,因此选择默认的Widgets Application模板即可。
-
设置项目路径和名字:路径和名称不能包含中文。
-
构建系统选择 :选择
qmake,这是 QT 的经典构建工具。CMake也被部分开源项目使用,而Qbs已停止维护。
-
UI 文件(Formfile):
-
在 QT 中创建图形界面的方式有两种:使用 C++ 代码创建,或使用
Formfile图形界面创建。 -
我们选用图形化方式快速编辑。

-
基类选择
QWidget。
-
-
其他选项:编译器选择等保持默认即可。
二、生成代码
1. main.cpp
cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
创建 QT 项目后,会自动生成这些代码。
-
main函数的形参即为命令行参数。 -
QApplication:是编写 QT 应用程序时必须的类,管理应用程序的控制流和主要设置。 -
show方法:-
Widget w; -
w.show(); -
Widget是创建项目时输入的类名。 -
.show()用于显示窗口控件,改为.hide()则为隐藏。
-
-
exec方法 :与 Linux 的exec不同,这是启动应用程序的事件循环,让程序运行起来。
2. widget.h / widget.cpp
-
继承关系 :
class Widget : public QWidget,即继承了创建项目时选择的基类QWidget。 -
Q_OBJECT宏:QT 内置的宏,展开后会生成一些代码,是 QT 信号和槽机制的核心所需。 -
构造函数和析构函数 :

-
Ui::Widget *ui;:这个指针与.ui文件(Formfile)密切相关,用于访问界面上的控件。
3. widget.ui
-
双击该文件会调用
QT Designer,打开图形化编辑器,可以从左侧拖拽控件到界面上。 -
返回代码编辑区可以看到其格式,本质上是
XML文件。
-
这个区域已经被封装好了,我们只需运行程序即可看到界面。
4. .pro 文件
- 这是 QT 的工程文件。
-
QT += core gui:指定项目需要引入的 QT 模块。 -
SOURCES,HEADERS,FORMS:这些部分列出了项目中的源文件、头文件和界面文件。通常不需要手动修改,QT Creator会自动维护。
5. 运行后生成的文件
-
运行项目后,会生成一个
build-开头的文件夹。 -
ui_widget.h是由widget.cpp里的setupUi调用(ui->setupUi(this);)所创建的。 -
它根据
.ui文件生成了具体的界面设置代码。
三、创建控件
1. Label(标签)
-
图形化创建:
-
在
widget.ui中拖拽Label到界面上即可。
-
此时,在
widget.ui文件里就会有一个QLabel标签。
-
-
代码创建:
-
在
widget.cpp的构造函数中创建。 -
在
main函数中有Widget w;这一行,创建Widget对象时就会调用构造函数,从而创建出画面。 -
添加头文件:
#include <QLabel>(QT 历史较早,有.h和没有.h的头文件都存在,两者都可以)。 -
创建对象并指定父对象:
cppQLabel* q1 = new QLabel(this); // this 就是 Widget w,给这个标签指定父对象 q1->setText("Hello World"); -
QT 有自己封装的字符串类
QString。开发时std::string和QString都可以用,但QString在处理编码(尤其是中文)时更友好。 -
注意:这里没有
delete不会造成内存泄露。- 原因 :QT 使用对象树 机制,当父对象(
Widget)被销毁时,会自动销毁其所有子对象(如这里的q1)。
- 原因 :QT 使用对象树 机制,当父对象(
-
如果将
QLabel对象创建在栈上(如QLabel q1(this);),在构造函数结束时它就会立即销毁,导致无法显示。
-
2. 编辑框
-
单行编辑框 :
QLineEdit -
多行编辑框 :
QTextEdit -
图形化实现 :拖拽
Line Edit控件到界面上即可。 -
代码实现:
cpp
QLineEdit* q = new QLineEdit(this); q->setText("hello world");
3. 一个简单的交互程序:点击按钮切换文字
-
图形界面实现:
-
拖拽一个
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"); else ui->pushButton->setText("hello world"); }
-
-
使用 Lambda 表达式一步搞定:
cppconnect(ui->pushButton, &QPushButton::clicked, this, [this]() { if (ui->pushButton->text() == QString("hello world")) ui->pushButton->setText("hello qt"); else ui->pushButton->setText("hello world"); }); -
纯代码实现:
-
首先,在
widget.h的Widget类中添加成员变量:QPushButton* pushButton; -
在
widget.cpp的构造函数中创建并连接:cpppushButton = 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)点就是父窗口的左上角。