一、QT入门:从框架到第一个Hello World

说实话,每次带新人入门QT,我都会先问一个问题:你为什么要学QT?

很多人回答「因为要写界面」。嗯,这个答案没错,但不够。QT远不止是个界面库。我做了这么多年C++开发,QT是我见过最成熟的跨平台应用框架之一。它把C++的底层能力和高级抽象结合得特别好。

今天这一章,咱们就从头捋一遍QT的核心脉络。我会把我这些年踩过的坑、积累的经验都揉进去。你跟着走一遍,心里就有底了。

1.1 QT框架到底是什么?

QT是一个C++的跨平台应用开发框架。说白了,就是一套写好的C++类库,帮你处理窗口、网络、数据库、多线程这些脏活累活。

我2015年第一次用QT做项目,当时接了个工业控制软件。客户要求Windows和Linux都能跑。如果用MFC,得写两套代码。用QT,一套代码搞定。这就是它的核心价值。

QT的核心能力:

  • 跨平台:一套代码,编译出Windows、Linux、macOS、Android、iOS版本
  • 丰富的组件库:按钮、表格、树、图表、Web引擎……开箱即用
  • 信号与槽:QT最独特的通信机制,后面我会重点讲
  • 工具链完善:Qt Creator、qmake、Qt Designer、文档生成器

你可能会问:QT和MFC、wxWidgets比,优势在哪?

我个人觉得,QT最大的优势是「设计感」。它的API设计非常一致,命名规范,学习曲线相对平缓。MFC那套宏定义看得人头皮发麻,QT就好很多。

1.2 信号与槽机制——QT的灵魂

信号与槽,是QT最核心的机制。没有它,QT就只是个普通的C++类库。

先看一个场景:你点了一个按钮,程序要弹出一个对话框。传统做法是写回调函数,或者事件监听。QT的做法是——按钮发出一个信号(clicked),你写一个槽函数(onButtonClicked),然后用connect把它们连起来。

代码长这样:

// 按钮点击信号连接到自定义槽
connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

我在项目中遇到过一个问题:多个信号连到同一个槽,结果槽里分不清是哪个信号触发的。后来我用了sender()函数来判断来源。嗯,这个技巧挺实用。

小提示:信号与槽是类型安全的。编译时就会检查信号和槽的参数是否匹配。这比回调函数那种void*传参安全得多。

信号与槽的底层实现,其实是用了一个元对象编译器(MOC)。你写的Q_OBJECT宏,就是告诉MOC:这个类需要处理信号与槽。MOC会生成额外的C++代码。所以,如果你编译时遇到「未定义的符号」错误,八成是忘记运行MOC了。

我曾经被这个坑过整整一个下午。后来养成习惯:只要加了Q_OBJECT,就重新qmake一下。

1.3 Qt Creator——你的主战场

Qt Creator是QT官方IDE。说实话,它不算最漂亮的IDE,但胜在轻量和专注。

我第一次打开Qt Creator时,界面很清爽。左边是项目面板,中间是代码编辑器,下面是编译输出。没有VS那么臃肿,也没有Eclipse那么卡。

几个我常用的功能:

  • 设计模式(Design Mode):拖拽控件,所见即所得。适合快速搭界面原型
  • 信号与槽编辑器:图形化连接信号和槽,不用手写connect
  • 帮助文档(F1):QT的文档质量很高。我遇到不懂的类,直接按F1查
  • 调试器:支持GDB和CDB,断点、变量查看、调用栈都挺好用

注意:Qt Creator的自动补全有时会抽风。如果代码补全不工作,检查一下项目是否配置了正确的Kit(编译器套件)。我遇到过好几次,都是Kit没选对。

我个人习惯把Qt Creator的字体调成Consolas 12号,背景色改成淡黄色。长时间看代码眼睛没那么累。你可以在「工具→选项→环境→字体」里设置。

1.4 第一个QT程序:Hello World

好了,理论说够了。咱们动手写个Hello World。

打开Qt Creator,点击「新建项目」→「Application」→「Qt Widgets Application」。项目名就叫HelloWorld。一路默认,直到完成。

你会看到自动生成了几个文件:main.cpp、mainwindow.cpp、mainwindow.h、HelloWorld.pro。

main.cpp是入口。默认代码是这样的:

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    QWidget w;
    w.setWindowTitle("Hello World");
    w.resize(400, 300);
    w.show();
    
    return a.exec();
}

这段代码干了三件事:

  1. 创建QApplication对象——每个QT程序有且只有一个
  2. 创建QWidget窗口,设置标题和大小
  3. 调用show()显示窗口,进入事件循环

你运行一下,应该能看到一个400x300的窗口,标题写着「Hello World」。

如果你想在窗口里显示文字,可以加一个QLabel:

#include <QLabel>

// 在main函数里
QLabel *label = new QLabel("Hello World!", &w);
label->setGeometry(100, 100, 200, 50);
label->setAlignment(Qt::AlignCenter);

这样窗口中间就会显示「Hello World!」了。

小技巧:QLabel默认是纯文本。如果你想显示富文本(比如HTML),可以用label->setText("<b>Hello</b> World!")。QT的QLabel支持简单的HTML标签。

我第一次写QT程序时,犯了个低级错误:忘记在.pro文件里添加QT += widgets。结果编译报错说找不到QApplication。后来我记住了:用哪个模块,就在.pro里加对应的QT += xxx。

1.5 知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作一个地图,心里有个全局观。

QT入门 QT框架简介 跨平台C++框架 丰富的组件库 工具链完善 信号与槽机制 类型安全通信 connect连接 MOC元对象编译器 Qt Creator使用 设计模式拖拽 信号槽编辑器 帮助文档F1 Hello World程序 QApplication QWidget窗口 QLabel显示文字 核心:跨平台 + 信号与槽 + 工具链

1.6 本章小结

这一章,我们走过了QT的四个关键点:

  • QT框架是什么——跨平台C++应用框架,不是单纯的界面库
  • 信号与槽——QT的通信机制,用connect连接信号和槽函数
  • Qt Creator——开发IDE,设计模式、调试器、文档查询
  • Hello World——从创建项目到显示窗口,跑通第一个程序

你想想看,这些内容其实就构成了QT学习的「最小闭环」。框架认知、核心机制、开发工具、动手实践,缺一不可。

我建议你今晚就把Hello World跑起来。哪怕只是改个窗口颜色、加个按钮,也比只看不写强。编程这东西,手熟了,心就不慌了。


公众号:蓝海资料掘金营,微信 deep3321