一、Qt简介
1、什么是Qt
图形用户界面应用程序开发框架,是对底层的应用程序编程接口进行面向对象的封装,是一套基于C++语言的类库,专注但不局限于用户界面开发,也可以进行系统调用、网络通信、数据库、2D/3D建模、图像处理、音视频处理等。
特点:跨平台,支持Linux、Windows、MacOS、iOS、Android系统。
2、为什么选择Qt
基于C++语言,简单易用。
优良的跨平台特性,在个人计算机、工控、嵌入式的界面占据主导地位。
二、Qt环境与工具
1、工具
Qt助手:Qt的man手册,涉及Qt的每个类,是学习Qt的必备手册,在终端可以使用assistant命令打开。
Qt设计器:对于程序员来说最纯粹的方式就是编写代码来实现程序的界面,但这种方式费时费力,而使用Qt设计是以画图的形式来实现程序的界面(所见即所得)。
Qt界面编译器:负责把Qt设计器制作出的界面文件.ui 翻译成C++代码。
uic xxx.ui -o xxx.h
Qt构造器:它负责对源文件、头文件、界面文件进行解析生成项目脚本
qmake -project 它会根据当前目录下的所有文件生成 项目脚本.pro
qmake 根据项目脚本生成Makefile
Qt创造器:它是由Qt助手+Qt设计器+Qt界面编译器+Qt构造器+C++编译器+文本编辑器+Qt库组合而成一个集成开发环境。
2、头文件和库
Qt安装好之后会在/usr/include/qt4目录下存储着Qt所有的头文件。
共享库存储在/usr/lib/i386-linux-gnu/qt4目录下。
静态库需要下载Qt源码进行手动编译。
三、第一个Qt程序
#include <QtGui/QApplication> // Qt界面程序必备的头文件

#include // 标签控件

int main(int argc,char* argv[])
{
// 创建应用程序对象
QApplication app(argc,argv);

// 创建一标签对象
QLabel* lab = new QLabel("Hello Qt");
// 显示标签对象
lab->show();

// 运行应用程序
return app.exec();

}
构建项目:
qmake -project 生成.pro文件
qmeke 生成Makefile脚本
make 编译项目

四、Qt创造器的使用方式
1、打开Qt创建器
在Dash主面中搜索Qt,打开Qt Creator。
在终端执行qtcreator也可以打开。
2、创建项目
Qt控件项目->Qt Gui应用->输入项目名称(不要有中文)->选择项目路径->选择主界面->完成
3、编译运行项目
点击绿色按钮,编译并运行当前项目,编译之前要行保存代码。
Ctrl+s+r 保存所有文件并编译运行项目。
4、常用的快捷键
Alt+0 显示隐藏侧边栏
Ctrl+e 松开后按3 垂直分割当前窗口
Ctrl+e 松开后按2 水平分割当前窗口
Ctrl+e 松开后按1 删除分割当前窗口
Ctrl+e 松开后按0 删除所有的分割当前窗口
Ctrl+b 编译项目
Ctrl+s+b 保存所有文件后编译项目
Ctrl+r 编译运行项目
Ctrl+s+r 保存所有文件并编译运行项目
Ctrl+/ 注释/取消注释代码//
Ctrl+i 格式化代码//
Ctrl+Shift+r 批量修改变量名,修改完成后按Enter确认
Ctrl+f 搜索、替换
Ctrl+单击 追踪定义、声明
Shift+F2 定义与声明之间进行切换
Alt+u 大写标识符转换成小写
Alt+Shift+u 小写标识符转换成大写
F4 头文件与源文件之间切换
F1 打开帮助手册
注意:Qt Creator在编写代码时会自动提示,但不要打开输入法,否则将不提示。
五、帮助手册
Inherits:该类继承了哪些类
Properties:访问属性是protected的成员变量
Public Functions:访问属性是public的成员函数
Reimplemented Public Functions:可以覆盖的public的成员函数
Public Slots:访问属性是public的槽函数,可以当普通的成员函数一样使用,也可以与信号进行连接。
Signals:该控件可以发出的信号
Reimplemented Protected Functions:可以覆盖的protected成员函数
Additional Inherited Members:说明的它的成来自哪些类。
Detailed Description:对该类的详细说明,有注意事项,示例代码。
Macros:与本类相关的宏函数和宏常量

六、中文乱码处理
原因:Qt 4.8版本默认不是utf-8字符编码,所以会出现中文乱码的现象。
解决方案:设置Qt的字符编码为utf-8
1、导入字符编码头文件:#include
2、创建字符编码对象
//QTextCodec* codecForName(const char * name);
QTextCodec* codec = QTextCodec::codecForName(“utf-8”);
3、告诉Qt当前系统的字符编码
QTextCodec::setCodecForLocale(codec);
4、告诉Qt程序的内部字符编码
QTextCodec::setCodecForCStrings(codec);
5、告诉Qt程序的外部字符编码
QTextCodec::setCodecForTr(codec);
/*
QTextCodec *codec=QTextCodec::codecForName(“utf-8”);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
*/
七、窗口容器
从Hello示例可以看出,每个控件都是一个独立的窗口,如果想把多个控件集合到一起形成一个界面时,需要就专门盛放控件的窗口容器。
QMainWindwo主窗口容器
成员有:标题栏、菜单栏、工具栏、状态栏、中央显示区。

QDialog对话框容器
主要用于管理交换控件

QWidget局部窗口容器
最纯粹的一种窗口容器,只有一块中央显示区,它是QDialog、QMainWindow的父类。

使用方式:
    1、创建窗口容器对象
    2、在他去控制时,把窗口容器对象的地址传递给控件。
    3、设置控件的位置、大小
    4、显示窗口容器

八、Qt中的字符串和数据输出
QString类,它具备C++中string类的所有功能。
QString在string的基础上增加很多转换函数。
toDouble、toFloat、toInt、toLong、toLongLong、toLower、toShort、toStdString、toUInt、toULong、toULongLong 、toUShort、toUpper

数据输出:
    是为了测试效果,打印提示信息、警告、错误等,这类数据不适合显示在界面上。
    C/C++中的printf/puts/cout可以继续使用。
    在Qt中建议使用qDebug,它既可以像printf一样使用,也可以像cout一样使用(需要添加头文件QDebug)。
    
注意:sprintf/scanf依然无法被取代。

九、界面文件在创造器的工作原理
1、项目创建完成后会生成一个xxx.ui的界面文件,双击该文件就是使用Qt设计器对界面文件进行编辑。
2、当我们运行项目时,Qt界面编译器会对xxx.ui进行编译生成一个ui_xxx.h的头文件,该文件在创造器无法看到。
3、ui_xxx.h文件中会有一个Ui_Xxx类,该类中包含了界面文件中所有的控件对象,它的setupUi成员会对控制的大小、位置、样式进行设置。
4、ui_xxx.h文件中还有一个Xxx类继承了Ui_Xxx类,且被包含在Ui名字空间中。
5、在创造器中自动生成xxx.h、xxx.cpp,xxx.h文件中也会自动创建一个叫Xxx的类,但与ui_xxx.h头文件中的Xxx并不会冲突,因为它们不在一个名字空间中。
6、xxx.h头文件中的Xxx类会自动包含Ui::Xxx* ui的成员,该成员会在Xxx类的初始化列表中被new创建。
7、Xxx的构造函数中调用setupUi函数(ui->setupUi(this)😉,对控件进行了设置。
8、在之后的代码中通过 ui->控件对象名 可以对控件进行设置和操控。
十、界面设计器的使用技巧
1、对控件对象取一个合适的名字
2、调整控件的位置和大小
通过鼠标拖拽
通过设置属性,geomtry(x、y,宽度、高度)
通过方向键微调
方向键 以10xp为单位移动
Ctrl+方向键 以1xp为单位移动
Shift+方向键 以10xp为单位调整大小
Shift+Ctrl+方向键 以1xp为单位调整大小
3、双击控件设置控制上显示的文字
4、设置控件上文本的对齐方式
alignment 水平对齐、垂直对齐
5、设置控件是否启用
6、设置控制的文字显示样式
font 字体、字号、加粗

十一、控件共用的成员函数
pos() 获取控件的位置对象 QPoint
x() 获取控件的横向位置
y() 获取控件的竖向位置
move() 设置控件的位置
size() 获取控件的大小对象 QSize (获取)
resize() 设置控件的大小(设置)
width() 获取控件的宽度
height() 获取控件的高度
show() 显示控件
hide() 隐藏控件
setText() 设置控件上要显示的文字内容
text() 获取控件上的文字内容
setStyleSheet() 设置控件的样式表(使用css语法设置)

练习1:实现QQ登录界面。

十二、信号和槽函数
Qt采用信号和槽机制让控制的动作和代码的功能发生联动,当用户在界面完成某些动作,就会触发相就的信号,
而此时就会调用已经绑定好的槽函数,槽函数执行完毕后,再把执行权限返回app对象。

为什么Qt采用这种机制?
    1、默认Qt程序是单进程且只有一个主线程的。
    2、主线程要负责维护界面,时刻监控用户的操作。
    3、当信号触发时才会调用槽函数执行相应的代码,然后要立即返回,否则界面就会出现卡死现象。

信号与槽的绑定方法:
    static bool connect(const QObject *sender, const char *signal,
                    const QObject *receiver, const char *member);
    功能:绑定信号与槽函数
    sender:信号发生者的对象地址
    signal:信号
        SIGNAL 负责把信号转换成字符串
    receiver:信号接收者的对象地址
    member:槽函数
        SLOT 负责把槽函数转换成字符串
    注意:在写信号和槽函数时一定要使用自动提示,因为connect函数要的是信号和槽的字符串,一旦编写错误编译器不会有任何提示。

    注意:信号和槽的相关对象必须继承QObject类,QObject类是所有Qt类的父类,信号和槽机制就实现在该类中。

connect的第五个参数:
    它决定槽函数在哪个线程执行,执行时是否阻塞。
    Qt::DirectConnection 直接连接,槽函数无论在哪个线程中,都在信号发者所在的线程中执行。
    Qt::QueuedConnection 间接连接,槽函数在哪个线程就由哪个线程中执行,多线程情况,槽函数执行过程中不会影响界面。
    Qt::BlockingQueuedConnection 间接连接,与Qt::QueuedConnection,但是信号发出执行槽函数的过程中会阻塞。
    Qt::AutoConnection 自动连接,如果sender和receiver在同一个线程则相当直接连接,如果不在同一个线程则相当于间接连接。