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 | class XXX |
槽函数格式:
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 | QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member,Qt::ConnectionType = Qt::AutoConnection); |
最后一个参数: Qt::ConnectionType表示了信号与槽之间的关联方式
Qt::AutoConnection(缺省值):自动确定关联方式
Qt::DirectConnection: 信号被发射时,槽立即执行,槽函数与信号在同一线程
Qt::QueuedConnection: 事件循环回到接收者线程后执行槽,槽与信号在不同线程
Qt::BlockingQueueConnection: 与Qt::QueuedConnection相似,信号线程会被阻塞直到槽执行完毕。当槽函数与信号在同一线程,会造成死锁。
在槽函数里,使用QObject::sender()可以获取信号发射者的指针,下面代码是写在槽函数中的,槽函数知道发送信号得类型,可以使用动态类型转换拿到他的指针,然后设置发送者得值和使用值都是可以得
1 | QSpinBox*spinbox = qobject_cast<QSpinBox *> (sender()) |
自定义信号及其使用
1 | class QPerson:public QObject |
信号函数必须无返回值,但可以有输入参数信号函数无需实现,只需在某些条件下发射信号
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 | /* |
示例:
1 | #if QT_VERSION >= 0x051402 |
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 | class QRect Q_DECL_FINAL //QRect 不能再被继承 |
Q_UNUSED(name): 这个宏用于在函数中定义不在函数体里使用的参数
1 | void MainWindow::on_imageSaved(int id, const QString &fileName) |
foreach(variable,container): 用于容器类的遍历
1 | foreach (const QString &codecName, recorder->supportedAudioCodecs()) |
例如recorder有三个值遍历三次,每次的值都传给codeName
forever: 用于构造一个无限循环
1 | 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 | int toInt(bool *ok = Q_NULLPTR,int base = 10); |
QString 将字符串转换为浮点数的函数有:
1 | double toDouble(bool *ok = Q_NULLPTR)const |
希望显示两位小数,下面4行语句都可以实现这个功能
1 | str = QString::number(total,'f',2); |
字符串与输入输出
QString的常用功能
QString存储字符采用的是Unicode码,(16位Qchar)
append()和prepend() 后面添加或者前面添加字
1 | QString str1 = "卖",str2 = "拐"; |
oUpper()和toLower() 字符转换成大写或小写
1 | QString str1 = "Hello World",str2; |
count()、size()和length()
1 | QString str1 = "NI好" |
trimmed()和simplified() 掐头去尾,空格合并
1 | QString str1 = " Are you OK? ",str2; |
indexOf() 和 lastlndexOf()
1 | //int indexOf(const QString &str,int from = 0, QT::CaseSensitivity cs = Qt::CaseSensitive)const |
isNull()和isEmpty() 未赋值字符串 空字符串
1 | QString str1,str2 = ""; |
QString 只要赋值,就在字符串的末尾自动加上”\0”,如果只要判断字符串内容释放为空,常用isEmpty()