当前位置: 首页>后端>正文

Qt基本知识

QT基本知识:

Qt基本知识,第1张

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基本知识,第2张

QT命名规范:

Qt基本知识,第3张
Qt基本知识,第4张
Qt基本知识,第5张
Qt基本知识,第6张
Qt基本知识,第7张

QT中绝大部分类都是继承Qobject ,Qobject是一个顶层类。

QT 按钮小程序:

(1)父子关系

默认情况下,按钮没有认干爹的情况下,是一个顶层窗口,想要按钮显示在窗口上,就要跟窗口建立父子关系。

方法一:setParent函数。

方法二:构造函数传参。

(2)QT坐标系

以父窗口的左上角为原点(0,0);以向右为X轴的正方向;以向下为y轴正方向;

顶层窗口以屏幕左上角为原点。

(3)QT常用API

Qt基本知识,第8张

?(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(第一个信号发送者,第一个信号,第二个信号发送者,第二个信号);

Qt基本知识,第9张

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(函数原型))

Qt基本知识,第10张
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表达式:用于定义匿名的函数对象

Qt基本知识,第11张
lambda表达式基本构成

[capture] 捕获外部局部变量的列表,值传递,直接填变量名,引用传递就使用&变量名

1.? 捕获局部变量的两种方式,一种值传递,一种引用:

? ? = 将局部变量全部使用值传递捕获,捕获局部变量包括this

? ? & 局部变量全部使用引用传递捕获进来

? ? [&,b]只有b是值传递? /? [=,&b]只有b是引用传递

2.? ?默认情况下值传递捕获进来的局部变量就是const,需要修改的话使用mutable选项

返回值类型可省略,编译器自动计算返回值

3.无特殊情况下,建议使用[=](){}

Qt基本知识,第12张
Qt基本知识,第13张
Qt基本知识,第14张

格式:(1)
//调用lambda的方式,使用函数指针

//? ? void (*p)()=[]()

//? ? {

//? ? ? qDebug()<<"hello lambda";

//? ? };

//? ? p();

?格式:(2)与上面含义等价

? ? []()

? ? {

? ? ? qDebug()<<"hello lambda";

? ? }();

?




https://www.xamrdz.com/backend/3ra1942701.html

相关文章: