Qt

图形用户界面

Qt的图形用户界面的基础是QWidget。Qt中所有类型的GUI组件如按钮、标签、工具栏等都派生自QWidget，而QWidget本身则为QObject的子类。Widget负责接收鼠标，键盘和来自窗口系统的其他事件，并描绘了自身显示在屏幕上。每一个GUI组件都是一个widget，widget还可以作为容器，在其内包含其他Widget。
QWidget不是一个抽象类别。并且可以被放置在一个已存在的用户界面中;若是Widget没有指定父Widget，当它显示时就是一个独立的视窗、或是一个顶层widget。QWidget显示能力包含了透明化及Double-Buffering。Qt提供一种托管机制，当Widget于创建时指定父对象，就可把自己的生命周期交给上层对象管理，当上层对象被释放时，自己也被释放。确保对象不再使用时都会被删除。

信号与槽

Qt利用信号与槽（signals/slots）机制取代传统的callback来进行对象之间的沟通。当操作事件发生的时候，对象会发提交一个信号（signal）；而槽（slot）则是一个函数接受特定信号并且运行槽本身设置的动作。信号与槽之间，则透过QObject的静态方法connect来链接。
信号在任何运行点上皆可发射，甚至可以在槽里再发射另一个信号，信号与槽的链接不限定为一对一的链接，一个信号可以链接到多个槽或多个信号链接到同一个槽，甚至信号也可连接到信号。
以往的callback缺乏类型安全，在调用处理函数时，无法确定是传递正确类型的参数。但信号和其接受的槽之间传递的数据类型必须要相符合，否则编译器会提出警告。信号和槽可接受任何数量、任何类型的参数，所以信号与槽机制是完全类型安全。
信号与槽机制也确保了低耦合性，发送信号的类别并不知道是哪个槽会接受，也就是说一个信号可以调用所有可用的槽。此机制会确保当在"连接"信号和槽时，槽会接受信号的参数并且正确运行。

Graphics View

Graphics View提供了用于管理和交互大量定制的2D图形对象的平面以及可视化显示对象的视图widget，并支持缩放和旋转功能。
整个Graphics View框架提供一个以Item为基础的model-view设计。由3个主要的类别组成，分别是QGrphicsItem、QGraphicsScene和QGraphicsView。若干View可以显示一个Scene，Scene中则包含不同几何形状的Item。
该框架包括一个事件传播的架构，让在Scene上的Item有双精度的交互能力。Item可以处理键盘事件，鼠标按下、移动、释放和双击事件，他们也可以跟踪鼠标移动。
Graphics View使用BSP（二进制空间划分）树可非常快速地找到Item，因此即使是包含百万个Item的大型Scene，也能实时图形化显示。
KDE中的Plasma亦是基于Graphics View实现的。

无障碍环境

无障碍环境需要无障碍兼容的应用程序、辅助技术、以及辅助工具之间的合作。应用程序通常不会直接沟通辅助工具，而是通过一个辅助技术，这是一个应用程序和工具之间信息交流的桥梁。用户界面元素相关消息，例如按钮和滚动条，使用辅助技术来显示。Qt支持Windows上的Microsoft Active Accessibility（MSAA）和Mac OS X上Mac OS X Accessibility。
无障碍兼容的应用程序称为AT-Servers，而辅助工具被称为AT-Clients。Qt应用程序通常会是一个AT-Server，但特别的程序也可能如同AT-Client方式工作。

国际化

Qt的字体引擎能够在同一时间正确的显示各种不同的书写系统。并且Qt内部使用Unicode编码来存储文字。
Qt的多国语言支持技术，可以让应用程序中的文字全部使用英文撰写，能够在完全不需修改程序的状况下，改变整个应用程序中的文字为另一个语系的文字，并能够协助处理不同语言的单、复数问题。
独立的翻译文件使得新增支持语言相当容易，同时翻译文件（.ts）为XML格式可以直接编辑或使用Qt Liguist进行翻译，可让无程序开发能力的翻译者亦能独自完成翻译。Qt附带的工具程序就能够自动抽取需要翻译的文字产生翻译文件。

多线程

Qt的线程支持是独立于平台的线程类别，采用信号与槽机制，实现类型安全的线程间通讯。这使得它易于开发具可移植性的多线程Qt应用程序。并能充分利用多核架构，获得最佳运行性能，还能根据可用的处理器内核数自动调整使用的线程数。多线程程序设计也是一个执行耗时操作而不会冻结用户界面的有效典范。

Qt的hello world

将下面的代码保存到Hello.cpp中
#include <QtWidgets/QApplication>#include <QtWidgets/QLabel>int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QLabel label("Hello, world!");
    label.show();
    return app.exec();}