QT开发1

QT Windgets Application: 桌面平台的图形用户界面(GUI)应用程序
QT Console Application: 控制台应用程序,一般用于学习C/C++
Qt Quick Application: 创建可部署的Qt Quick2应用程序。Qt Quick是Qt支持的一套GUI开发架构。采用QML设计界面,程序框架采用C++语言
Qt Quick Controls 2 Application: 创建基于Qt Quick Control2组件的可部署的Qt Quick 2 应用程序。
Qt Canvas 3D Application: 基于QML语言的界面设计,支持3D画布。

QMainWindow:主窗口类,具有主菜单、工具栏和状态栏,类似一般程序的主窗口
Qwidget:是所有具有可视化界面类的基类,各种界面组件都支持
QDialog:对话框类,建立基于对话框的界面

Action Editor:Action编辑器
Signals & Slots Editor:信号与槽

Widget:Qwidget窗口:从上大小,继承关系(下面的都是派生类)

信号与槽
———————-发送者———–信号———–接受者———–槽———–
编写关闭 Botton_close clicked() Widget close()

很重要必须要看的文件
ui_widget.h:
ui_mainwindow.h:

项目中添加资源文件:文件 -> 新建文件或项目 -> QT ->Qt Resource File->输入名字,创建*.qrc文件
在项目中点击 :open in editor可以打开文件
*.qrc文件点击Add Prefix创建文件,修改相应的前缀, 点击Add Files添加相关文件

要在头文件中编写槽函数必须如下格式:

1
2
3
4
5
class XXX
{
private slots: //私有的槽函数如下
};

槽函数格式:

1
QObject::connect(this->ui->radioButton_black, SIGNAL(clicked()), this, SLOT(setTextFontColor()));

Action :非常有用的类,可以创建菜单项、工具栏按钮

快捷操作
——-功能————————快捷键————–解释————–
Switch Header/Source F4 在同名的头文件和源程序文件之间切换

Follow Symbol Under Cursor F2 变量:跳转到声明;函数:声明和定义切换

Switch Between Function Shift+F2 函数:声明和定义切换
Declartion and Definition

Refacetor\Rename Symbol Ctrl+Shift+R 改名称,将替换所有用到这个符合的地方
Under Cursor

Refactor\Add Definitionin .cpp 为函数原型在cpp文件中生成函数体

Auto-indent Selection Ctrl+I 为选择的文字自动进行缩进

Toggle Comment Selection Ctrl+/ 注释或取消注释

Context Help F1 为光标所在的符号显示帮助

Save All Ctrl+Shift+S 文件全部保存

qt核心特点
元对象编译器(meta-object Complier,MOC)是一个预处理器(所谓的元就是:meta在英文词中有超越、更上一层的含义。)
先将Qt的特性程序转换成标准C++程序,再由标准C++编译器进行编译
元对象的意义

使用信号与槽机制,只有添加Q_OBJECT宏,moc才能对类里的信号与槽进行预处理

Qt为C++语言增加的特性在Qt core模块里实现,由Qt的元对象系统实现包括:信号与槽机制、属性系统、动态类型转换等。

元对象系统 (Meta-Object System)
1.Qobject类是所有使用元对象系统的类的基类
2.在一个类的private部分声明Q_OBJECT宏
3.MOC(元对象编译器)为每个QObject的子类提供必要的代码

qobject_cast(类类型转换) 与 C++语言种 static_cast(数据类型之间转化) 、dynamic_cast

属性系统:
Q_PROPERTY宏定义一个返回类型为type!,名称为name的属性

1

参考:https://zhuanlan.zhihu.com/p/516163795

信号与槽

1
2
3
4
5
6
7
8
9
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member,Qt::ConnectionType = Qt::AutoConnection);

//如果信号和槽函数带有参数,需要注明参数类型
connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(updateStatus(int)));

QMetaObject::Connection QObject::connect(cosnt QObject *sender,const OMetaMethod &signal,const QObject *receivers,const QMetaMethod &method,Qt::ConnectionType = Qt::AutoConnection)
//对于信号名称唯一的(不能有重载,有重载函数只能用上面的),没有参数不同而不同的信号函数
connect(lineEdit,&QLineEdit::textChanged,this,&widget::on_textChanged);

最后一个参数: Qt::ConnectionType表示了信号与槽之间的关联方式
Qt::AutoConnection(缺省值):自动确定关联方式
Qt::DirectConnection: 信号被发射时,槽立即执行,槽函数与信号在同一线程
Qt::QueuedConnection: 事件循环回到接收者线程后执行槽,槽与信号在不同线程
Qt::BlockingQueueConnection: 与Qt::QueuedConnection相似,信号线程会被阻塞直到槽执行完毕。当槽函数与信号在同一线程,会造成死锁。

在槽函数里,使用QObject::sender()可以获取信号发射者的指针,下面代码是写在槽函数中的,槽函数知道发送信号得类型,可以使用动态类型转换拿到他的指针,然后设置发送者得值和使用值都是可以得

1
QSpinBox*spinbox = qobject_cast<QSpinBox *> (sender())

自定义信号及其使用

1
2
3
4
5
6
7
8
9
10
11
12
class QPerson:public QObject
{
Q_OBJECT
private:
int m_age = 10;
public:
void incAge();//是一个按钮,按下就触发
signals:
void ageChanged(int value);
};

void QPerson::incAge(){m_age++;emit ageChanged(m_age);//发射信号}

信号函数必须无返回值,但可以有输入参数信号函数无需实现,只需在某些条件下发射信号

QT全局定义(Global:全局的意思)
<QtGlobal>头文件包含了qt类库的一些全局定义
1.基本数据类型 2.函数 3.宏
因为太常用,所以不用显示的包含,QT类的头文件都会包含该文件(函数类型的定义必须使用这些变量定义,不要使用#include<cstdint>

qreal 缺省是8字节double类型浮点数,如果Qt使用 -qreal float 选项进行配置,就是4字节float 类型的浮点数

qfloat16 是Qt5.9.0中新增的一个类用于表示16位的浮点数,要使用gfloat16,需要包含头文件<QFloat16>

全局函数定义
————函数—————————————–功能———————–
T qAbs(const T &value) 返回变量value的绝对值

const T&qBound(const T &min,const T
&value,const T & max) 返回value限定在min至max范围之内的值

bool qFuzzyCompare(double p1,double p2) 若p1和P2近似相等,返回true
bool qFuzzyCompare(float p1,float p2)

bool qFuzzylsNull(double d) 如果参数d约等于0,返回true

double qlnf() 返回无穷大的数

bool qlsFinite(double d) 若d是一个有限的数,返回true
bool qlslnf(double d) 若d是一个无限大的数,返回true
bool qlsNaN(double d) 若d不是一个数,返回true
const T&qMax(const T&value1,const T&value2) 返回value1和value2种最大的值
const T&qMin(const T&value1,const T&value2) 返回value1和value2种最小的值
qint64 qRound64(double value) 将value近似为最接近的qint64整数
int qRound(double value) 将value近似为最接近的int整数

还有一些基础的数学运算函数在 <QtMath> 头文件中定义,比如三角运算函数、弧度与角度之间的转换函数等。

QT_VERSION: 这个宏展开为数值形式0xMMNNPP (MM = major, NN = minor, PP = patch) 表示Qt编译器版本,例如Qt编译器版本为Qt 5.9.1,则 QT_VERSION 为 0x050901。这个宏常用于条件编译设置,根据Qt版本不同,编译不同的代码段。

QT_VERSION_CHECK: 这个宏展开为 Qt 版本号的一个整数表示

源码:

1
2
3
4
5
6
7
8
/*
QT_VERSION is (major << 16) + (minor << 8) + patch.
*/
#define QT_VERSION QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)
/*
can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
*/
#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))

示例:

1
2
3
4
5
#if QT_VERSION >= 0x051402
/*code*/
#else
/*code*/
#nedif

QT_VERSION_STR: 这个宏展开为Qt版本号的字符串,如“5.9.0”

Q_BYTE_ORDER、Q_BIG_ENDIAN和Q_LTTLE_ENDIAN: Q_BYTE_ORDER表示系统内存中数据的字节序,Q_BIG_ENDIAN 表示大端字节序,Q_LITTLE_ENDIAN 表示小端字节序。在需要判断系统字节序时会用到

Q_DECL_IMPORT和Q_DECL_EXPORT:在使用或设计共享库时,用于导入或导出库的内容后续章节有其使用实例。

Q_DECL_OVERRIDE: 在类定义中,用于重载一个虚函数,例如在某个类中重载虚函数paintEvem(),可以定义如下: void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE使用该宏后,如果重载的虚函数没有进行任何重载操作,编译器将会报错

Q_DECL_FINAL: 这个宏将一个虚函数定义为最终级别,不能再被重载,或定义一个类不能再被继承

1
2
3
4
5
class QRect Q_DECL_FINAL	//QRect 不能再被继承
{

}

Q_UNUSED(name): 这个宏用于在函数中定义不在函数体里使用的参数

1
2
3
4
5
void MainWindow::on_imageSaved(int id, const QString &fileName)
{
Q_UNUSED(id);
Lablnfo->setText("图片保存为:"+fileName);
}

foreach(variable,container): 用于容器类的遍历

1
2
foreach (const QString &codecName, recorder->supportedAudioCodecs())
ui->comboCodec->addltem(codecName);

例如recorder有三个值遍历三次,每次的值都传给codeName

forever: 用于构造一个无限循环

1
2
3
4
forever
{
//中间要退出要有相应代码
}

qDebug(const char* message,..) : 在debugger窗体显示信息,如果编译器设置了Qt_NO_DEBUG_OUTPUT,则不作任何输出

1
qDebug("ltems in list: %d", myList.size());

类似的宏还有 qWarning、gCritical、gFatal、glnfo 等,也是用于在 debugger 窗体显示信息

字符串与数值之间的转换
1.QString类可以显示字符串与数值之间的转换 ;2.使用QLable、QLineEdit显示和输入信息; 3.使用布局

QString类从字符串转换为整数的函数有:

1
2
3
4
5
int toInt(bool *ok = Q_NULLPTR,int base = 10);
const long toLong(bool *ok = Q_NULLPTR,int base = 10);
const short toShort(bool *ok = Q_NULLPTR,int base = 10);
const uint toUInt(bool *ok = Q_NULLPTR,int base = 10);
const ulong toULong(bool *ok = Q_NULLPTR,int base = 10)const;

QString 将字符串转换为浮点数的函数有:

1
2
double toDouble(bool *ok = Q_NULLPTR)const
float toFloat(bool * ok= Q_NULLPTR)const

希望显示两位小数,下面4行语句都可以实现这个功能

1
2
3
4
str = QString::number(total,'f',2);
str = QString::asprintf("%.2f",total);
str = str.setNum(total,'f',2);
str = str.sprintf("%.2f",total);

字符串与输入输出
QString的常用功能
QString存储字符采用的是Unicode码,(16位Qchar)

append()和prepend() 后面添加或者前面添加字

1
2
3
4
QString str1 = "卖",str2 = "拐";
QString str3 = str1;
str1.append(str2); //str1 = 卖拐
str3.prepend(str2); //str2 = 拐卖

oUpper()和toLower() 字符转换成大写或小写

1
2
3
QString str1 = "Hello World",str2;
str2 = str1.toUpper(); //str2 = "HELLO WORLD"
str2 = str1.toLower(); //str2 = "hello world"

count()、size()和length()

1
2
3
4
QString str1 = "NI好"
N = str1.count() //N = 3
N = str1.size() //N = 3
N = str1.length() //N = 3

trimmed()和simplified() 掐头去尾,空格合并

1
2
3
QString str1 = " Are    you    OK? ",str2;
str2 = str1.trimmed(); //str1 = "Are you OK?"
str2 = str1.simplified() //str1 = "Are you OK?"

indexOf() 和 lastlndexOf()

1
2
3
4
5
//int indexOf(const QString &str,int from = 0, QT::CaseSensitivity cs = Qt::CaseSensitive)const
//需要找str字符串种特点字符,从那个位置开始找,默认区分大小写
QString str1 = "G:\QT_5_PRO\sampl6_1\sampl6_1\main.cpp";
N = str1.indexOf("5_");//n = 7
N = str1.lastlndexOf("\\"); //n = 29 这里双斜杠是代表斜杠,只不过是找的最后一个斜杠

isNull()和isEmpty() 未赋值字符串 空字符串

1
2
3
4
5
QString str1,str2 = "";
N= str1.isNull(); N= true 未赋值字符串变量
N= str2.isNull(); N = flase 只有'\0'的字符串,也不是Null
N= str1.isEmpty();N= true
N= str2.isEmpty();N= true

QString 只要赋值,就在字符串的末尾自动加上”\0”,如果只要判断字符串内容释放为空,常用isEmpty()