1. Designer设计师 (掌握)
Qt 包含了一个Designer程序,用于通过可视化界面设计开发界面,保存的格式为.ui(界面文件)。界面文件内部使用xml语法的标签式语言。
在Qt Creator中创建项目时,选中界面文件选项,可以让自带的窗口类使用界面文件。



所有Designer中操作都可以通过C++代码实现。
2. 布局Layout (掌握)
可以把布局看做成一个透明的盒子,内部可以放置子组件,这些内部的子组件会按照布局预设的规则进行排序。

垂直布局:内部组件竖着排成一列。
水平布局:内部组件横着排成一排。
格栅布局:内部组件排布成n*m的表格。
表单布局:用户搭建用户输入的布局效果

选中布局后,点击可以打破布局。
布局可以贴合窗口,只需要选中窗口对象后,再次点击按钮之一即可。

可以使用伸展组件填充空白。
布局也是可以嵌套的,对于外层布局而言,内层布局相当于外层布局的一个子组件。

3. QWidget类 (掌握)
QWidget的属性在Designer中显示为淡黄色。常用属性如下:

策略:除非必要情况,或者实现特殊功能,否则我们的策略尽量不要修改,因为当前的策略对组件是最友好的。

4. 界面文件与C++代码的关系 (熟悉)

5. QLabel标签
5.1 基本属性
QLabel可以用来显式文字或者图片,但是需要注意的是,QLabel不能与用户交互(不能点击),只能展示使用,因此没有合适的信号函数。

我们也可以直接对组件对象进行命名, 系统默认的命名方式是"标签名称_序号"的方式,可以直接双击命名,命名完成后,需要回车。

5.2 添加资源库
把图片导入到项目中,成为项目资源,直接使用Qt的虚拟路径导入图片,可以在任何的环境中进行使用这些资源图片了。
Qt中支持以下几种常见的图片格式:
jpg(不包含透明度)、png(包含透明度)、gif(动图)等等
注意导入的图片一定不能特别大(分辨率过高或者体积过大)。因为图片的操作非常消耗程序的资源。
下面是导入图片成为项目资源的操作步骤:
- 把命名好的(不包含任何的中文)图片文件放置到项目的工作目录中。

- 在Qt Creator中选中项目名称,鼠标右键,点击添加"新文件"
- 在弹出的窗口中,按照下图所示进行操作

3.在弹出的窗口中给资源文件命名 ,例如res

4.在项目管理界面直接点击完成,可以看到在项目中多了一个qrc格式的资源文件。

5.选中qrc文件,点击,可以给资源文件新建一个虚拟路径。
6.选中qrc文件,点击,可以导入图片到项目中成为资源。
7.导入成功后,可以在qrc文件中看到导入成功的图片:

5.3 使用资源库
点击小锤子重新构建目录。然后就可以在Designer中找到图片并且使用了。


5.4 使用代码添加图片
- 我们也可以通过代码添加图片,以及修改图片尺寸。

将缩放模式取消掉,然后取消图片。
2、如果通过代码添加,需要用到头文件#include<QPixmap>头文件,图片类头文件。
// 图片类构造函数`
`// 参数1:图片资源路径(qrc文件选中图片资源鼠标右键复制)`
`// 参数2:样板格式,使用默认值即可`
`// 参数3:图片颜色格式,也是使用默认即可`
`QPixmap::` `QPixmap(const QString & fileName,` `const` `char` `* format =` `0, Qt::ImageConversionFlags flags = Qt::AutoColor)`
`
3.当前已经创建图片类对象,但是还需要进行缩放,指定图片的输出模式。
// 缩放`
`// 参数1:QSize类型对象,表示目标尺寸。需要添加头文件#include<QSize>`
`// 参数2:缩放模式,三种。是一个枚举`
`// 参数3:以速度优先还是质量优先,两种模式,默认以速度优先,也是一个枚举`
`// 返回值:转换后的QPixmap对象`
`QPixmap QPixmap:: scaled(const QSize & size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const`
`
QSize类
// 构造函数`
`// 图片的宽度和高度`
`QSize::` `QSize(int width,` `int height)`
`
dialog.h
#ifndef DIALOG_H`
`#define DIALOG_H`
`#include <QDialog>`
`#include <QPixmap>`
`#include <QSize>`
`namespace Ui {`
`class` `Dialog;`
`}`
`class` `Dialog` `:` `public QDialog`
`{`
` Q_OBJECT`
`public:`
`explicit` `Dialog(QWidget *parent =` `0);`
`~Dialog();`
`private:`
` Ui::Dialog *ui;`
`};`
`#endif // DIALOG_H`
`
dialog.cpp
#include "dialog.h"`
`#include "ui_dialog.h"`
`Dialog::Dialog(QWidget *parent)` `:`
`QDialog(parent),`
`ui(new Ui::Dialog)`
`{`
` ui->setupUi(this);`
`// 创建一个图片对象`
`// 参数:图片的资源路径`
` QPixmap pic(":/new/prefix1/logo.png");`
`// 定义QSize对象`
` QSize size(ui->labelPic->width(),ui->labelPic->height());`
`// 缩放`
` pic = pic.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation);`
`// 使用界面文件中的组件对象`
` ui->labelPic->setPixmap(pic);`
`}`
`Dialog::~Dialog()`
`{`
`delete ui;`
`}`
`
第十四行的labelPic是这的对象名字。

5.5 使用代码添加动态图
添加动态图:
- 需要将我们的动态图,放到项目的工作目录中,并且进行命名.gif
- 添加完成后,需要将动态图,加载到资源文件中
电影类
如果需要播放动态图,需要用到电影类,需要添加头文件#include<QMovie>。
// 电影类构造函数,堆区创建
// 参数1 :资源路径
// 参数2:输出模式
// 参数3:基类指针,看到基类指针,就知道要创建堆内存对象
QMovie::
QMovie(const QString & fileName,
const QByteArray & format =
QByteArray(), QObject * parent =
0)
dialog.h
#ifndef DIALOG_H`
`#define DIALOG_H`
`#include <QDialog>`
`#include <QPixmap>`
`#include <QSize>`
`#include <QMovie>`
`namespace Ui {`
`class` `Dialog;`
`}`
`class` `Dialog` `:` `public QDialog`
`{`
` Q_OBJECT`
`public:`
`explicit` `Dialog(QWidget *parent =` `0);`
`~Dialog();`
`private:`
` Ui::Dialog *ui;`
` QMovie *movie;` `// 电影类指针`
`};`
`#endif // DIALOG_H`
`
dialog.cpp
#include "dialog.h"`
`#include "ui_dialog.h"`
`Dialog::Dialog(QWidget *parent)` `:`
`QDialog(parent),`
`ui(new Ui::Dialog)`
`{`
` ui->setupUi(this);`
`// 创建一个图片对象`
`// 参数:图片的资源路径`
` QPixmap pic(":/new/prefix1/logo.png");`
`// 定义QSize对象`
` QSize size(ui->labelPic->width(),ui->labelPic->height());`
`// 缩放`
` pic = pic.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation);`
`// 使用界面文件中的组件对象`
` ui->labelPic->setPixmap(pic);`
`// 创建电影类对象`
` movie =` `new` `QMovie(":/new/prefix1/kunkun.gif");`
`// 给QLabel设置电影`
` ui->labelGif->setMovie(movie);`
`// 播放电影`
` movie->start();`
`}`
`Dialog::~Dialog()`
`{`
`delete ui;`
`delete movie;`
`}`
`
6. QAbstractButton按钮类
QAbstractButton是按钮类的抽象基类,因此内部包含类按钮的基础属性和函数。


GroupBox 分组盒子组件

QAbstractButton按钮类的基础属性:

给按钮添加一个图标:
将下载的图标,放到项目的工作目录中。

添加完成后,发现图标很小,可以将图标的尺寸更改

更改完成后,可以将按钮大小锁死

更改完成后发现有个小框,勾选下面选项,可以取消按钮小框

border: none;` `/* 取消边框 */`
`background-color: transparent;` `/* 设置背景色为透明,使按钮看起来更加平滑 */`
`

按钮类常用的信号:

dialog.h
#ifndef DIALOG_H`
`#define DIALOG_H`
`#include <QDialog>`
`#include <QDebug>`
`namespace Ui {`
`class` `Dialog;`
`}`
`class` `Dialog` `:` `public QDialog`
`{`
` Q_OBJECT`
`public:`
`explicit` `Dialog(QWidget *parent =` `0);`
`~Dialog();`
`private:`
` Ui::Dialog *ui;`
`private slots:`
`void` `toggledSlot(bool);`
`};`
`#endif // DIALOG_H`
`
dialog.cpp
#include "dialog.h"`
`#include "ui_dialog.h"`
`Dialog::Dialog(QWidget *parent)` `:`
`QDialog(parent),`
`ui(new Ui::Dialog)`
`{`
` ui->setupUi(this);`
`connect(ui->radioButton,SIGNAL(toggled(bool)),`
`this,SLOT(toggledSlot(bool)));`
`}`
`Dialog::~Dialog()`
`{`
`delete ui;`
`}`
`void` `Dialog::toggledSlot(bool checked)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"超意兴被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选超意兴了";`
`}`
`}`
`
按钮组
按钮组
QButtonGroup组件
可以使用QB uttonGroup组件对多个按钮进行分组,这是一个逻辑分组,没有任何的ui效果。其主要的目的是使用一个信号槽同时监控多个按钮对象的状态 。

QButtonGroup继承于QOBject并非QWidget,所以它是不可见的,用户无法从这个窗口中看到此组件。
// 构造函数 堆区创建`
`QButtonGroup:: QButtonGroup(QObject * parent = 0)`
`
// 给按钮组,添加要管理的按钮`
`// 参数1:添加的实际的按钮`
`// 参数2:序号ID`
`void QButtonGroup::` `addButton(QAbstractButton * button,` `int id =` `-1)`
`

参数中表示当前触发的按钮对象本身,
表示当前触发的按钮序号。
dialog.h
#ifndef DIALOG_H`
`#define DIALOG_H`
`#include <QDialog>`
`#include <QDebug>`
`#include <QButtonGroup>`
`namespace Ui {`
`class` `Dialog;`
`}`
`class` `Dialog` `:` `public QDialog`
`{`
` Q_OBJECT`
`public:`
`explicit` `Dialog(QWidget *parent =` `0);`
`~Dialog();`
`private:`
` Ui::Dialog *ui;`
` QButtonGroup *btp;`
`private slots:`
`void` `toggledSlot(bool);`
`void` `buttonToggledSlot(int,bool);`
`};`
`#endif // DIALOG_H`
`
dialog.cpp
#include "dialog.h"`
`#include "ui_dialog.h"`
`Dialog::Dialog(QWidget *parent)` `:`
`QDialog(parent),`
`ui(new Ui::Dialog)`
`{`
` ui->setupUi(this);`
`connect(ui->radioButton,SIGNAL(toggled(bool)),`
`this,SLOT(toggledSlot(bool)));`
`// 创建组件对象`
` btp =` `new` `QButtonGroup(this);`
` btp->addButton(ui->checkBox,1);`
` btp->addButton(ui->checkBox_2,2);`
` btp->addButton(ui->checkBox_3,3);`
` btp->addButton(ui->checkBox_4,4);`
`// 注意,我们的按钮组件,是可以多选的,但是按钮组里的组件,默认是互斥的。`
`// 所以,要解除按钮组的互斥属性`
` btp->setExclusive(false);`
`connect(btp,SIGNAL(buttonToggled(int,bool)),`
`this,SLOT(buttonToggledSlot(int,bool)));`
`}`
`Dialog::~Dialog()`
`{`
`delete ui;`
`}`
`void` `Dialog::toggledSlot(bool checked)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"超意兴被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选超意兴了";`
`}`
`}`
`void` `Dialog::buttonToggledSlot(int id,` `bool checked)`
`{`
`if(id ==` `1)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"8+1被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选8+1了";`
`}`
`}`
`if(id ==` `2)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"雷花-勇闯天堂被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选雷花-勇闯天堂了";`
`}`
`}`
`if(id ==` `3)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"青鸟被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选青鸟了";`
`}`
`}`
`if(id ==` `4)`
`{`
`if(checked)`
`{`
`qDebug()` `<<` `"7天被选中了";`
`}`
`else`
`{`
`qDebug()` `<<` `"不选7天了";`
`}`
`}`
`else`
`{`
`}`
`}`
`
7. QLineEdit单行文本输入框
QLineEdit用于输入一个单行文本,常用的属性

常用的信号:

dialog.h
#ifndef DIALOG_H`
`#define DIALOG_H`
`#include <QDialog>`
`#include <QDebug>`
`namespace Ui {`
`class` `Dialog;`
`}`
`class` `Dialog` `:` `public QDialog`
`{`
` Q_OBJECT`
`public:`
`explicit` `Dialog(QWidget *parent =` `0);`
`~Dialog();`
`private:`
` Ui::Dialog *ui;`
`private slots:`
`void` `btnClickedSlot();`
`void` `selectionChangedSlot();`
`};`
`#endif // DIALOG_H`
`
dialog.cpp
#include "dialog.h"`
`#include "ui_dialog.h"`
`Dialog::Dialog(QWidget *parent)` `:`
`QDialog(parent),`
`ui(new Ui::Dialog)`
`{`
` ui->setupUi(this);`
`connect(ui->pushButton,SIGNAL(clicked()),`
`this,SLOT(btnClickedSlot()));`
`connect(ui->lineEdit,SIGNAL(selectionChanged()),`
`this,SLOT(selectionChangedSlot()));`
`}`
`Dialog::~Dialog()`
`{`
`delete ui;`
`}`
`void` `Dialog::btnClickedSlot()`
`{`
` QString text = ui->lineEdit->text();`
`qDebug()` `<<` `"第一个lineEdit:"` `<< text;`
` text = ui->lineEdit_2->text();`
`qDebug()` `<<` `"第二个lineEdit:"` `<< text;`
`}`
`void` `Dialog::selectionChangedSlot()`
`{`
`qDebug()` `<< ui->lineEdit->selectedText();`
`}`
`