QT基本知识:
QT基本模块:
(1)桌面开发使用模块:QT Widgets、QT Core、QT GUI、QT TEST、QT SQl
(2) 移动端使用模块:QTQuick、QT QML、QT MulitMedia Widgets、QT QuickControls、QT QuickDialog
(3)网络:QTNetwork
(4)多媒体:QT MulitMedia
QT命名规范:
QT中绝大部分类都是继承Qobject ,Qobject是一个顶层类。
QT 按钮小程序:
(1)父子关系
默认情况下,按钮没有认干爹的情况下,是一个顶层窗口,想要按钮显示在窗口上,就要跟窗口建立父子关系。
方法一:setParent函数。
方法二:构造函数传参。
(2)QT坐标系
以父窗口的左上角为原点(0,0);以向右为X轴的正方向;以向下为y轴正方向;
顶层窗口以屏幕左上角为原点。
(3)QT常用API
?(4)对象树
概念:各个窗口对象通过建立父子关系构造一个关系树
内存管理:父对象释放时会自动释放各个子对象(使用childern列表)
以后基本都是用new的方式来创建窗口对象,注意点:
1.父对象能被释放
2.父对象、子对象直接或者间接继承自Qobject
(5)信号和槽机制
信号:各种事件
槽:响应信号的动作
当某个事件发生后,如某个按钮被点击了一下,它就会发出一个被点击的信号 (signal)。
某个对象接收到这个信号之后,就会做一些相关的处理动作(称为槽slot)。但是Qt对象不会无故收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect) .
//信号发送者 ? ? ? ? //信号 ? ? ? //信号接收者 ? ? ?? //槽:信号处理动作
默认情况下,他们四者没有关系,通过connect建立四者关系
connect(信号发送者,信号,信号接收者,槽)
(6)标准信号和槽
信号和槽本质都是函数 ? ?? connect 里四个参数都是指针
使用connect保留&符号:
1.提高代码可读性
2.自动提示
(7)自定义信号和槽(信号和槽就是函数)
自定义信号(函数)
1.函数生命在类头文件的signals域下面
2.void类型函数,没有返回值
3.可以有参数,也可以重载
4.只有声明,没有实现定义
5.触发信号关键字:? ? ? emit obj->sign(参数...)
自定义槽(函数)
1.函数生命在类头文件的public\private\protected slots域下面(qt4以前的版本)
????????qt5 就可以声明在类的任何位置,还可以是静态成员函数、全局函数、lambda 表达式
2.void类型函数,没有返回值
3.可以有参数,也可以重载
4.不仅声明,还要实现定义
例:场景:下课了,老师说饿了,学生请吃饭
? ? ? ? ?信号发送者:老师
? ? ? ? ? 信号:老师饿了
? ? ? ? ? 信号接收者:学生
? ? ? ? ? ?槽:请吃饭
创多少个类:teacher 、student
信号:hungry?
槽:treat
带参数的自定义信号和槽:在声明函数的时候就带上参数就行
例:老师说饿了,要吃黄焖鸡,学生请吃黄焖鸡
参数二义性问题:(重载)
?1.使用函数指针赋值,让编译器挑选符合类型的函数?
?2.使用static_cast 强制转换,让编译器挑选符合类型的函数
调用带参数的信号函数:? ? emit pTeacher->hungry("AAAA");
信号和槽的拓展
1.一个信号可以连接多个槽,一个信号建立了多个connect,那么当信号发射的时候,槽函数的调用顺序:随机
2.一个槽可以连接多个信号
3.信号可以连接信号
connect(第一个信号发送者,第一个信号,第二个信号发送者,第二个信号);
4.信号可以断开连接
connect参数怎么填,disconnect就怎么填
5.信号和槽的参数关系,必须同时满足以下条件:
1)、信号和槽函数的参数类型必须对应
2)、信号和槽函数的参数个数不需要一致,但信号函数参数个数>=槽函数参数个数
例:hungry(QString)? ? ?->? treat()? ? ? ? ? ? ? ? ok
? ? ? ? hungry(QString)? ? ->? treat(int) ????????????会编译出错
? ??????? hungry(QString,int)? ? ->? treat(int)? ?会编译出错
QT4的信号和槽
使用两个宏 Signal Slot
connect使用不一样,信号和槽函数声明差不多
形式:connect(信号发送者,SIgnal(函数原型),信号接收者,Slot(函数原型))
优点:无二义性
缺点:写错不报错
QDebug
qDebug输出QString默认会转义输出:解决方法:
? ? 1.将QString 转成 char *
? ? // qDebug()<<"Student teart teacher"<<what.toUtf8().data();
? ? 2.使用qDebug().noquote()
? // qDebug().noquote()<<"Student teart teacher"<<what;
7/20
Lambda表达式:用于定义匿名的函数对象
[capture] 捕获外部局部变量的列表,值传递,直接填变量名,引用传递就使用&变量名
1.? 捕获局部变量的两种方式,一种值传递,一种引用:
? ? = 将局部变量全部使用值传递捕获,捕获局部变量包括this
? ? & 局部变量全部使用引用传递捕获进来
? ? [&,b]只有b是值传递? /? [=,&b]只有b是引用传递
2.? ?默认情况下值传递捕获进来的局部变量就是const,需要修改的话使用mutable选项
返回值类型可省略,编译器自动计算返回值
3.无特殊情况下,建议使用[=](){}
格式:(1)
//调用lambda的方式,使用函数指针
//? ? void (*p)()=[]()
//? ? {
//? ? ? qDebug()<<"hello lambda";
//? ? };
//? ? p();
?格式:(2)与上面含义等价
? ? []()
? ? {
? ? ? qDebug()<<"hello lambda";
? ? }();