Qt 每日面试题 -1

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

  • 优点∶

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

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

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

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

原因∶
①需要定位接收信号的对象
②安全地遍历所有关联槽
编组、解组传递参数
多线程的时候,信号需要排队等待。

(然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是他们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。)

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

回调函数

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

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

  • 文件流(QTextStream)。 操作轻量级数据( int,double,QString )数据写入文本件中以后以文本的方式呈现。
  • 数据流(QDataStream)。通过数据流可以操作各种数据类型,包括对象,存储到文件中数据为二进制

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

4、描述Qt中的TCP通讯流程

  • 服务端:(QTcpServer)
    创建QTcpServer对象
    监听list需要的ip地址端口号
    有新的客户端连接成功回发送newConnect信号
    在newConnection信号槽函数中,调用nextPendingConnection函数获取新连接QTcpSocket对象
    连接QTcpSocket对象的readRead信号
    在readRead信号的槽函数使用read接收数据
    调用write成员函数发送数据

  • 客户端:(QTcpSocket)
    创建QTcpSocket对象
    当对象与Server连接成功时会发送connected信号
    调用成员函数connectToHost连接服务器,需要参数ip地址和端口号, 在connected信号的槽函数开启发送数据
    使用write发送数据read接收数据

5、描述UDP通讯中的UdpSocket

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

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

  • 创建QUdpSocket套接字对象
  • 如果需要接收数据,必须绑定端口
  • 发送数据用writeDatagram,接收数据用readDatagram

6、多线程使用使用方法

方法一:

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

方法二:

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

多线程使用注意事项:

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

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

可以通过connect的第五个参数进行控制信号槽执行时所在的线程
connect有 3 种连接方式,直接连接、 队列连接、自动连接

  • 1 直接连接(Qt::DirectConnection ): 信号槽在信号发出者所在的线程中执行
  • 2 队列连接(Qt::QueuedConnection): 信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行
  • 3 自动连接(Qt::AutoConnection): 多线程时为队列连接函数,单线程时为直接连接函数。

8、自定义控件流程

需要继承自定义的控件类,如QPushButton

  • 外观设计上: QSS继承绘画函数重绘继承QStyle相关类重绘组合拼装等等;
  • 功能行为上: 重写事件函数、添加 或者修改信号和槽等等。

9、对QObject的理解

  • 1 QObject类是Qt所有类的基类。

  • 2 QObject是Qt对象模型的核心。这个模型的中心要素就是一种强大的叫做信号与槽机制。你可以用connect()函数来把一个信号连接到槽,也可以用disconnect()函数来破坏这个连接为了避免永无止境的通知循环,你可以用blockSignal()函数来暂时阻塞信号保护函数connectNotify()和disconnectNotify()可以用来跟踪连接

  • 3 对象树都是通过QObject组织起来的,当以一个对象作为父类创建一个新的对象时,这个新对象会被自动加入到父类的children()队列中。这个父类有子类的所有权。能够在父类的析构函数中自动删除子类。可以通过findChild()和findChildren()函数来寻找子类。

  • 4 每个对象都一个对象名称objectName(),而且它的类名也可以通过metaObject()函数。你可以通过inherits()函数来决定一个类是否继承其他的类。当一个对象被删除时,它会发射destory()信号,你可以抓住这个信号避免某些事情。

  • 5 对象可以通过event()函数来接收事情以及过滤来自其他对象的事件就好比installEventFiter()函数和eventFilter()函数。childEvent()函数能够重载实现子对象的事件。

  • 6 QObject还提供了基本的时间支持,QTimer类提高了更高层次的时间支持。

  • 7 任何对象要实现信号与槽机制,Q_OBJECT宏都是强制的你也需要在源原件上运行元对象编译器。不管是否真正用到信号与槽机制,最好在所有QObject子类使用Q_OBJECT宏,以避免出现一些不必要的错误。

  • 8 所有的Qt widgets都是基础QObject。如果一个对象是widget,那么isWidgetType()函数就能判断出

10、Qt自定义一个信号槽,触发这个信号,Qt多个信号如何关联一并处理

  • 第一种方法︰
    发送信号时,也发送一个int类型数字,或者说标志,这样在槽函数触发是可以知道是哪个信号发出的

  • 第二种方法︰
    在槽函数内通过sender()函数获取发送信号的对象的指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型爬虫—ScrapeGraphAI

大模型爬虫—ScrapeGraphAI 一、介绍 ScrapeGraphAI是一个网络爬虫 Python 库,使用大型语言模型和直接图逻辑为网站和本地文档(XML,HTML,JSON 等)创建爬取管道。 只需告诉库您想提取哪些信息,它将为您完成! scrapegraphai有三种主要的爬取管道可用于从网站(或本地文…

统信服务器操作系统【搭建FTP】设置介绍

如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。 文章目录 功能概述一、功能介绍二、准备环境三、安装步骤1. 在…

(undone) 学习语音学中关于 i-vector 和 x-vector

来源:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8461375 (这是一篇跟 X-vector 有关的论文) 这里有更适合初学者的两个资料: 1.https://www.youtube.com/watch?vR3rzN6JYm38 (MIT教授的youtube视频) 2.https://people.c…

linux 基础(一)mkdir、ls、vi、ifconfig

1、linux简介 linux是一个操作系统(os: operating system) 中国有没有自己的操作系统(华为鸿蒙HarmonyOS,阿里龙蜥(Anolis) OS 8、百度DuerOS都有) 计算机组的组成:硬件软件 硬件:运算器&am…

数据结构和算法之树形结构(1)

文章出处: 数据结构和算法之树形结构(1) 关注码农爱刷题,看更多技术文章!! 树形结构是数据结构四种逻辑结构之一,也是被广泛使用的一种逻辑结构,它描述的是数据元素之间一对多的逻辑关系。树是一种非线性的数据结构&a…

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢(使得所有数据都可以交换)?1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢? 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…

如何优化前端页面的 AJAX 请求性能并避免冲突

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响

摘要:本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社群运营中的作用,以及融入正能量对提高社群归属感的关键意义。通过分析正能量的精神感染力和对社群氛围的积极影响,阐述了在开源 AI 智能名片 S2B2C 商城小程序的各类活动中融入正能量的…

flask项目初始化

1、初始环境 python3.8 2、flask文档地址:https://flask.palletsprojects.com/en/latest/installation/#install-flask 3、初始化项目 $ mkdir myproject $ cd myproject $ python3 -m venv .venv $ . .venv/bin/activate $ pip install Flask4、打开项目mypr…

Ansible——Playbook基本功能???

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1)“play”2)“task”3)“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法:---以及多个---??使用 include 指令 1. 基本结构2. 数…

java后端字节一面

1. 我现在和你进行视频通话,这个是怎么做的? 视频通话通常基于实时通信技术(RTC),如WebRTC。它利用现代浏览器的API来实现视频、音频和数据的直接P2P(点对点)通信,或通过服务器中转。…

【JavaEE】IP协议 应用层协议

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 🕶️一.IP地址 IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议之一,它定义了数据包在网络中传输的标准…

应用层协议HTTP介绍

一、HTTP协议介绍 HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本。 超文本:视频,音…

24年蓝桥杯及攻防世界赛题-MISC-1

2 What-is-this AZADI TOWER 3 Avatar 题目 一个恐怖份子上传了这张照片到社交网络。里面藏了什么信息?隐藏内容即flag 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/outguess] └─$ outguess -r 035bfaa85410429495786d8ea6ecd296.jpg flag1.txt Reading 035bf…

如何使用命令行快速下载Google Drive/OneDrive大文件

OneDrive OneDrive使用wget下载会出现403 forbidden,可通过下面方法下载。 浏览器右键进入检查界面,选择netowork,搜索download.aspx,然后在待下载文件处点击下载,即可出现下载链接,复制为cURL即可下载。…

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接: FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统! 遥测数据处理可能很复杂,尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…

jenkins声明式流水线语法详解

最基本的语法包含 pipeline:所有有效的声明式流水线必须包含在一个 pipeline 块中stages:包含一系列一个或多个stage指令stage:stage包含在stages中进行,比如某个阶段steps:在阶段中具体得执行操作,一个或…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目,我已经上传了,资源链接. 起因, 目的: 每次都是新建一个 react 项目,有点繁琐。 刚刚学了路由,不如写一个 大一点的 app ,把前面写过的几个 app, 都包含进去。 这部分感觉就像是, …

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型,再选择编译。 八、Debug 九、Target 十、Tools 10.1 自定义快捷键 点击菜单项,通过Tools –> Options –> Keyboard,实现自…

Java | Leetcode Java题解之第413题等差数列划分

题目: 题解: class Solution {public int numberOfArithmeticSlices(int[] nums) {int n nums.length;if (n 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3,所以可以从 i2 开始枚举for (int i …