QT 面试题汇总[通俗易懂]

QT 面试题汇总[通俗易懂]一、讲述Qt信号槽机制与优势与不足优点:①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。…

大家好,又见面了,我是你们的朋友全栈君。

一、讲述Qt信号槽机制与优势与不足

优点: 类型安全需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。

          松散耦合信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。

         灵活性一个信号可以关联多个槽,或多个信号关联同一个槽。

不足:速度较慢。与回调函数相比,信号和槽机制运行速度比直接调用非虚函数慢10倍。

        原因:①需要定位接收信号的对象。②安全地遍历所有关联槽。③编组、解组传递参数。④多线程的时候,信号需要排队等待。然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是他们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。

二、Qt信号和槽的本质是什么 

        回调函数。信号或是传递值,或是传递动作变化;槽函数响应信号或是接收值,或者根据动作变化来做出对应操作。

三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别

       文件流(QTextStream)。操作轻量级数据(int,double,QString)数据写入文本件中以后以文本的方式呈现。

       数据流(QDataStream)。通过数据流可以操作各种数据类型,包括对象,存储到文件中数据为二进制。

        文件流,数据流都可以操作磁盘文件,也可以操作内存数据。通过流对象可以将对象打包到内存,进行数据的传输。

四、描述QT的TCP通讯流程

服务端:(QTcpServer)

        ①创建QTcpServer对象

        ②监听list需要的参数是地址和端口号

        ③当有新的客户端连接成功回发送newConnect信号

        ④在newConnection信号槽函数中,调用nextPendingConnection函数获取新连接QTcpSocket对象

        ⑤连接QTcpSocket对象的readRead信号

        ⑥在readRead信号的槽函数使用read接收数据

        ⑦调用write成员函数发送数据

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer;
    tcpServer->listen(QHostAddress("192.168.0.111"),1234);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(new_connect()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::new_connect()
{
    qDebug("--new connect--");
    QTcpSocket* tcpSocket = tcpServer->nextPendingConnection();
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(read_data()));
    socketArr.push_back(tcpSocket);

}

void Widget::read_data()
{
    for(int i=0; i<socketArr.size(); i++)
    {
        if(socketArr[i]->bytesAvailable())
        {
            char buf[256] = {};
            socketArr[i]->read(buf,sizeof(buf));
            qDebug("---read:%s---",buf);
        }
    }
}

客户端:(QTcpSocket)

        ①创建QTcpSocket对象

        ②当对象与Server连接成功时会发送connected 信号

        ③调用成员函数connectToHost连接服务器,需要的参数是地址和端口号

        ④connected信号的槽函数开启发送数据

        ⑤使用write发送数据,read接收数据

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket;
    connect(tcpSocket,SIGNAL(connected()),this,SLOT(connect_success()));
    tcpSocket->connectToHost("172.20.10.3",1234);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_send_clicked()
{
    std::string msg = ui->msg->text().toStdString();
    int ret = tcpSocket->write(msg.c_str(),msg.size()+1);
    qDebug("--send:%d--",ret);
}

void Widget::connect_success()
{
    ui->send->setEnabled(true);
}

五、 描述UDP 之 UdpSocket通讯

           UDP(User Datagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。在网络质量令人十分不满意的环境下,UDP协议数据包丢失严重。由于UDP的特性:它不属于连接型协议,因而具有资源消耗小处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。所以QQ这种对保密要求并不太高的聊天程序就是使用的UDP协议。

        在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。Socket简单地说,就是一个IP地址加一个port端口  。

        流程:①创建QUdpSocket套接字对象 ②如果需要接收数据,必须绑定端口 ③发送数据用writeDatagram,接收数据用 readDatagram 。

六、多线程使用使用方法

        方法一:①创建一个类从QThread类派生②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程, 调用start()函数

        方法二:①将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数②在主线程中创建一QThread类对象 ③在主线程中创建一个业务类对象 ④将业务类对象移动到子线程中 ⑤在主线程中启动子线程 ⑥通过信号槽的方式, 执行业务类中的业务处理函数

多线程使用注意事项: 
* 1. 业务对象, 构造的时候不能指定父对象 
* 2. 子线程中不能处理ui窗口(ui相关的类) 
* 3. 子线程中只能处理一些数据相关的操作, 不能涉及窗口

七、多线程下,信号槽分别在什么线程中执行,如何控制

        可以通过connect的第五个参数进行控制信号槽执行时所在的线程

  connect有几种连接方式,直接连接和队列连接、自动连接

  直接连接(Qt::DirectConnection):信号槽在信号发出者所在的线程中执行

  队列连接 (Qt::QueuedConnection):信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行

  自动连接  (Qt::AutoConnection):多线程时为队列连接函数,单线程时为直接连接函数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152851.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MediaCodec基本原理及使用「建议收藏」

    MediaCodec基本原理及使用「建议收藏」MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。广义而言,MediaCodec的工作原理就是处理输入数据以产生输出数据。具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交

  • c/c++成长之捷径 C/C++学习资料大全

    c/c++成长之捷径 C/C++学习资料大全socket协议三次握手与结束连接客户端代码:#include#include#include//forbzero#include//forsocketaddr_in#include#include#include#definePORT5050//端口号#defineMAXLEN_FOR_DATA

  • Linux常用打包压缩命令

    Linux常用打包压缩命令简介Linux上常用的压缩/解压工具,介绍了zip、rar、tar的使用。文件打包和压缩Linux上的压缩包文件格式,除了Windows最常见的*.zip、*.rar、.7z后缀的压缩文件,还有.gz、.xz、.bz2、.tar、.tar.gz、.tar.xz、tar.bz2文件后缀名说明*.zipzip程序打包压缩的文件*.rarrar程序压…

  • RapidXml使用方法

    RapidXml使用方法一、写xml文件#include#include”rapidxml/rapidxml.hpp”#include”rapidxml/rapidxml_utils.hpp”#include”rapidxml/rapidxml_print.hpp”usingnamespacerapidxml;intmain(){ xml_document<>doc;

  • 4g融合指的是什么_天翼网关3

    4g融合指的是什么_天翼网关3小草科技推出融合通信新产品系列——多网融合多路聚合今天,深圳小草信息科技有限公司发布了系列新产品,以解决当前移动互联网网络不稳定带宽不够、安全性差等问题。智能融合通信将有线与多路无线智能融合成为一路通道,并聚合多个通道形成一个大容量通道,实现大数据在一个聚合通道中的传输。加载自有协议,安全、快速、稳定的传送数据至云端,提供安全稳定的宽带传输通道,确保业务永不中断。1,MNF-410…

  • bfs是什么意思_bfs轮

    bfs是什么意思_bfs轮Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。这是一张有 8 个大小相同的格子的魔板:1 2 3 48 7 6 5我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态。这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号