1.QT服务端的搭建流程
步骤:创建QTcpSocket对象
绑定自己的IP和PROT并监听(使用listen函数)
建立连接:当客户端连接时socket会产生newConnection信号,槽函数里面有记录这个连接客户端的地址。
服务端的收发:发送:直接把内容写到socket->write()缓存区即可。接收:当客户端给缓存区写入数据时,会在服务端触发一个readyRead信号。在这个信号的槽函数里进行读取操作,socket->readALL()读取缓存区所有数据。
最后关闭连接。
2.QT多线程的实现方式
(1)QThread类的run
继承QThread类,重写run函数。此实现方法只有run函数内的代码是运行在子线程内。
(2)QThread类的moveToThread
创建一个QThread和QWorker(继承自QObject)类对象,使用moveToThread函数移动到thread中运行,通过thread类start信号和worker槽函数绑定
3.QT的机制,信号和槽
信号和槽主要作用是实现对象与对象之间的通信。主要通过connect函数来连接。
信号和槽的本质是回调函数。
connect(发送对象,发送的信号,接收的对象,槽函数);
4.窗口设置图片的方法
样式表:样式表可以设置界面,其中背景图片设置的关键字:setStyleSheet();
调色板:先获得Widget的调色板,然后设置调色板背景图片(setBrush),最后将调色板设置到Widget中。
重新绘图事件:在painEvent()中,使用drawPixmap在窗口的整个矩形区域绘制图片。(当我们改变窗口大小时,会自动触发绘图事件,图片可以适应窗口大小)
QLabel:间接方式,比如在窗口上覆盖一个QLabel,这个QLabel和窗口一样大,然后给QLabel设置背景图片,这样在视觉上与给背景设置图片的效果相同。
5.事件和信号的关系:(以点击按钮为例)
事件是信号的底层实现。
以点击按钮为例,当我们进行点击操作时,系统会生成一个对应的按钮点击事件,然后通过event做事件分发,执行对应的事件处理函数,在对应的事件处理函数中,我们再发射一个信号,最后通过connect绑定执行对应的槽函数,槽函数中实现需要的按钮功能。
6.信号和槽函数能否重载,参数的关系
信号和槽函数可以拥有信号,也可以重载。
信号的参数个数必须大于等于槽函数参数的个数,且槽函数参数从左到右与信号参数的类型严格匹配。
7.重写,重载,重定义
重载:在同一个作用域内,多个函数功能相似,逻辑相似,参数不同(个数、类型、顺序),返回值不影响一组函数互为重载。
重写:在继承关系中,子类重写了父类的虚函数(函数首部相同)。(实现具体功能)
重定义:在继承关系中,子类重新定义和父类同名的函数(仅函数名相同,非虚函数)。(父类不足以实现子类的要求)
8.QT三大护法
QApplication 控制整个程序执行的流程 .exec()
QWidget 所有界面以及界面控件的父类
QLayout 界面上布局的管理,控件摆放的位置。有相对布局和绝对布局两类。
9.堆栈溢出
简单的说,堆溢出是因为malloc或new空间之后没用释放,栈溢出是使用了非法的索引。
10.内存分配的方式
内存分配有三种方式:
从全局存储区域分配:这里的内存在程序编译阶段就会分配好,这段内存在程序运行的整个阶段都有效。比如:全局变量,static静态变量。
从栈区分配:在执行函数的时候,函数中的局部变量的存储单元可以从栈区分配,函数执行结束后这些存储单元会被自动释放。这个操作的效率很高,但分配的内存容量有限。
从堆中分配:这种分配方式也称为动态内存分配,在程序运行期间,使用malloc和new申请内存单元,需要程序员自己手动使用free和delete释放。