Qt面试题汇总

目录

1. 简单说一下Qt

 2. 用过QT中的哪些模块?

3. 说一些你常用的Qt控件? 

 4. Qt中如何创建一个窗口?

5. 说一下QT中创建控件的方式?

6. 说一下Qt中信号和槽机制是什么?

7. 说一下QT信号与槽机制原理?

8. 如何自定义信号和槽,信号和槽怎么连接?

9. 说一下Qt的事件处理流程?

10.说一下事件过滤器的作用?

11.Qt 中 connect() 函数中参数有哪些,第五个参数的作用和可选类型呢?

12.为什么选择 HTTP,不直接使用 TCP?

13. 说一下QT事件与信号的区别?

14.是否用过 Qt 的线程模块?并简单说明使用过的方式或类

15.Qt中怎么保证线程安全?

16.说一下TCP 三次握手的过程?

17.说一下TCP 连接断开时的四次挥手流程?

18. Qt 中的内存管理机制是如何实现的?


1. 简单说一下Qt

Qt 是一个跨平台的应用程序开发框架,它提供了一系列的工具和库,用于开发图形用户界面(GUI)应用程序。

优点:

  1. 跨平台,几乎支持所有平台

  2. 接口简单,文档详细

  3. 开发效率高

缺点: Qt 作为一个软件平台,比较庞大、臃肿。

 2. 用过QT中的哪些模块?

QtCore:提供基础类,比如 QStringQListQVariantQDateTime、事件循环、定时器等,是所有模块的基础。

QtGui:用于图形界面相关类,如图像处理、字体、颜色、绘图(QPainter)。

QtWidgets:实现传统桌面控件,如 QPushButtonQTableWidgetQMainWindow,用于搭建 UI 界面。

QtNetwork:用于实现 TCP/UDP 通信、HTTP 请求、Socket 服务等网络功能。

QtMultimedia:用于音频、视频播放和录制(如 QMediaPlayer)。

QtSerialPort:串口通信模块,常用于与外部设备的数据交互。

QtConcurrent / QThread:实现多线程与并发处理。

QtSql:用于连接数据库,如 SQLite、MySQL,执行查询、增删改等操作。

QtCharts:用于图表展示,常用于可视化折线图、柱状图等。

3. 说一些你常用的Qt控件? 

QLabel:标签,用于显示文字或图像

QPushButton:按钮,支持点击事件

QLineEdit:单行文本输入框

QSlider:滑动条

QProgressBar:进度条

QTabWidget:标签页控件(多页切换)

QScrollArea:带滚动条区域

QSplitter:可调节大小的分隔窗口

QFrame:基本容器,可自定义边框样式

QListWidget:列表控件

QFileDialog:文件/目录选择对话框

QColorDialog:颜色选择器

QMessageBox:消息提示框(信息、警告、确认等)

QInputDialog:获取用户输入的简易对话框

QCalendarWidget:日历选择控件

QDateTimeEdit:日期时间输入框

QChartView(QtCharts):图表控件(柱状图、折线图等)

 4. Qt中如何创建一个窗口?

在 Qt 中创建一个窗口通常是通过继承 QMainWindowQWidget 来实现,构造窗口对象、设置标题、大小等属性,然后调用 .show() 显示窗口,最后进入 QApplication 的事件循环。

5. 说一下QT中创建控件的方式?

Qt 中创建控件的方式主要包括三种:代码创建(手动 new)、UI 设计器创建(.ui 文件)、以及自定义控件(继承 QWidget)

6. 说一下Qt中信号和槽机制是什么?

Qt 中的信号和槽(Signal & Slot)机制是一种对象间通信机制,用于在对象状态变化时通知其他对象,类似于发布-订阅模式。
当一个对象发出信号时,所有与该信号连接的槽函数都会自动被调用,从而实现模块间的解耦。

7. 说一下QT信号与槽机制原理?

 Qt 的信号与槽机制是基于 元对象系统(Meta-Object System) 实现的,核心依赖 QObjectmoc(元对象编译器)。

  1. moc 扫描头文件中的 signalsslots,生成信号和槽的元信息。

  2. 把信号槽信息按声明顺序存储到类的静态成员 staticMetaObject 中,建立索引映射。

  3. connect 调用时,根据信号和槽的索引,在连接表(内部数据结构)中记录对应关系。

  4. emit 发射信号时,调用 QMetaObject::activate,传入信号索引、对象指针和参数列表。

  5. activate 根据信号索引查找连接表,找到所有对应的槽函数索引。

  6. 根据槽索引调用对应槽函数,支持直接调用或跨线程异步调用。

8. 如何自定义信号和槽,信号和槽怎么连接?

信号(signal):是类中定义的特殊成员(signals: 声明),用于通知某些事件发生。

槽(slot):是一个普通成员函数或用 slots: 标记的函数,用于接收信号触发的处理逻辑。

连接方式:通过 QObject::connect() 函数将信号与槽绑定。

9. 说一下Qt的事件处理流程?

在 Qt 中,事件由系统或用户行为触发后,会被加入事件队列,并通过事件循环分发到对应的对象。

如果该对象或其祖先安装了事件过滤器,事件会优先被过滤器处理;

否则,事件会传递给对象的 event() 函数,进而调用具体的事件处理函数(如 mousePressEvent())。

如果事件未被处理,可能会继续向上传递或被忽略,从而完成整个事件处理流程。

10.说一下事件过滤器的作用?

用于在事件到达目标对象之前提前拦截和处理事件

通过安装事件过滤器,可以在不修改目标对象代码的情况下,对其事件进行监听、修改甚至阻止,常用于日志记录、统一处理、特殊控件行为扩展等场景。

11.Qt 中 connect() 函数中参数有哪些,第五个参数的作用和可选类型呢?

sender:发送信号的对象

signal:发送的信号(用 SIGNAL() 宏包裹)

receiver:接收信号的对象

slot:槽函数(用 SLOT() 宏包裹)

connectionType(第五个参数)连接类型,控制信号和槽的调用方式

第五个参数(connectionType)可选值:

Qt::AutoConnection:默认,自动判断(跨线程→队列连接,否则→直接连接)

Qt::DirectConnection:立即同步调用槽函数(在发送信号的线程中)

Qt::QueuedConnection:异步调用,槽函数在接收者线程中执行

Qt::BlockingQueuedConnection:跨线程同步执行,发送线程会阻塞直到槽执行完(⚠不能用于主线程)

Qt::UniqueConnection:防止重复连接(需与其他类型一起使用)

12.为什么选择 HTTP,不直接使用 TCP?

TCP 是传输层协议,提供可靠的字节流传输,而 HTTP 是基于 TCP 之上的应用层协议,HTTP封装了请求响应格式、状态码、头部字段等,极大简化了通信流程,提升了开发效率。

而使用 TCP 通信虽然更底层、性能好,但需要开发者自行处理协议设计、粘包拆包、加密安全等复杂细节,开发和维护成本高。

13. 说一下QT事件与信号的区别?

事件(Event) 是系统或用户交互产生的底层通知,如鼠标点击、键盘按下、窗口变化等,它们通过事件循环分发给对象,需重写事件处理函数(如 mousePressEvent)来响应。

信号(Signal) 是 Qt 对象之间的通信机制,表示对象状态变化或动作发生,配合槽(Slot)实现对象间的解耦通知。信号是程序内部主动发出的,用于组件间消息传递。

14.是否用过 Qt 的线程模块?并简单说明使用过的方式或类

继承 QThread 重写 run() 方法,实现自定义线程任务

使用 QObject 对象放到线程里,通过 moveToThread() 把对象和它的槽函数移到新线程运行

利用 Qt 的信号与槽机制实现线程间安全通信

使用 QtConcurrent 进行简单的并发任务(如果用过)

15.Qt中怎么保证线程安全?

信号与槽机制:使用跨线程信号槽连接(Qt::QueuedConnection),自动在线程间传递消息,避免直接共享数据

互斥锁(QMutex):对共享资源加锁,防止多个线程同时访问导致数据冲突

读写锁(QReadWriteLock):支持多个线程并发读,写操作时加写锁,提升性能

原子操作(QAtomicXXX):对简单数据类型做无锁的线程安全操作

线程局部存储(QThreadStorage):为每个线程维护独立数据,避免数据共享问题

16.说一下TCP 三次握手的过程?

第一次握手(客户端 → 服务端):

客户端发送一个带 SYN 标志位 的数据包,表示请求建立连接,并随机初始化一个序列号 seq=x。

第二次握手(服务端 → 客户端):

服务端收到后,发送一个带 SYN 和 ACK 标志位 的数据包,表示接受请求并同步自己的连接信息。它会回复 ack=x+1 表示收到了客户端的 SYN,同时生成自己的序列号 seq=y。

第三次握手(客户端 → 服务端):

客户端收到后,发送一个带 ACK 标志位 的数据包,ack=y+1,表示自己也收到了服务端的确认。至此,双方建立连接,可以开始数据传输了。

17.说一下TCP 连接断开时的四次挥手流程?

第一次挥手(客户端 → 服务端)

客户端发送一个 FIN 报文,表示“我没有数据要发了”,请求关闭连接。

第二次挥手(服务端 → 客户端)

服务端收到 FIN 后,发送一个 ACK 报文,表示“我知道你要断开了”。但此时服务端可能还有数据要发,连接还没完全断。

第三次挥手(服务端 → 客户端)

等服务端数据发送完毕后,主动发送一个 FIN 报文,告诉客户端:“我也没数据要发了”。

第四次挥手(客户端 → 服务端)

客户端收到 FIN 后,发送一个 ACK 报文,表示“我确认你也关闭了”。至此,连接关闭。

18. Qt 中的内存管理机制是如何实现的?

Qt 的内存管理依赖于其 父子对象机制。当你用 new 创建一个 QObject 派生类对象,并将其父对象传入构造函数中,Qt 会自动将该对象加入父对象的子对象列表中。当父对象销毁时,它会自动销毁所有子对象,从而避免内存泄漏。

此外,Qt 的 deleteLater() 方法可用于安全地延迟删除对象,确保不会在事件处理中立即销毁自己。

整体上,这种机制实现了自动层级释放、生命周期托管和结构化内存管理

19.QT界面卡顿遇到过吗?怎么优化?

在使用 Qt 开发中,我确实遇到过界面卡顿的情况,主要原因通常是将耗时操作(如网络请求、大量计算、文件读写等)放在主线程中执行,阻塞了 GUI 线程。

我主要通过将耗时任务放入子线程、使用 QThreadQtConcurrent 进行后台处理,再通过信号槽异步更新 UI,从而优化界面流畅性。

简答:Qt UI 卡顿多数是主线程阻塞导致的,关键优化思路是:UI 和逻辑分离,耗时操作异步执行,主线程专注渲染

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

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

相关文章

【stm32】标准库学习——USART串口

目录 一、USART串口 1.串口参数及时序 2.USART简介 3.配置USART基本结构 4.初始化模板 (1) 接收一个数据 (2) 发送一个数据 一、USART串口 1.串口参数及时序 波特率:串口通信的速率起始位:标志一个数据帧的开始,固定为低电平数据位:数据帧的有效载荷&#…

黑马Day01-03集开始

03集 JSX jsx里面可以写 表达式,表达式里面会返回一个值js语法的扩展,需要babel解析才能够在浏览器运行 语法 使用花括号 {} ,在里面进行编写jsx代码04集 高频场景 使用引号传递字符串 使用js变量 函数调用和方法调用 使用js对象.js自带的一些对象或new出来的对象{&quo…

vue 路由学习

params 不能传递对象类型如 [ ]和{ } query传参 总结: query传参既可以通过name 和path 找到路由规则里的组件,所以为了统一避免非必要麻烦 无论是使用query传参还是 params传参 映射路由建议统一使用 name 进阶 props的使用 备注:资料来自…

JDK安装全攻略:开启Java编程大门

目录 一、安装前准备1.1 确认系统类型1.2 检查系统要求1.3 下载 JDK 安装包 二、Windows 系统下 JDK 安装步骤2.1 双击安装包2.2 选择安装目录2.3 完成安装 三、Windows 系统环境变量配置3.1 打开环境变量设置3.2 配置 JAVA_HOME 变量3.3 配置 Path 变量3.4 验证配置 四、Linux…

《P1253 扶苏的问题》

题目描述 给定一个长度为 n 的序列 a,要求支持如下三个操作: 给定区间 [l,r],将区间内每个数都修改为 x。给定区间 [l,r],将区间内每个数都加上 x。给定区间 [l,r],求区间内的最大值。 输入格式 第一行是两个整数&…

09.【C语言学习笔记】指针(一)

目录 1. 内存和地址 1.1 内存 1.2 究竟该如何理解编址 2. 指针变量和地址 2.1 取地址操作符(&) 2.2 指针变量和解引用操作符(*) 2.2.1 指针变量 2.2.2 如何拆解指针类型 2.2.3 解引用操作符 * 2.3 指针变量的大小…

Java中static关键字的作用与使用详解

static是Java中一个非常重要的关键字,它可以用来修饰变量、方法、代码块和嵌套类。下面将从多个方面详细解释static的作用和使用方法。 一、static变量(类变量) 作用 static变量属于类,而不是类的某个实例。所有实例共享同一个s…

HMLDM-UD100A 型工业激光测距仪通过modbusRTU 转 profinet 网关轻松接入到西门子1200plc

HMLDM-UD100A 型工业激光测距仪通过modbusRTU 转 profinet 网关轻松接入到西门子1200plc 在现代工业生产与自动化控制领域,精准的测量设备与高效的通信技术至关重要。HMLDM-UD100A 型工业激光测距仪凭借其高精度、稳定性强等优势,广泛应用于各类工业场景…

数据结构与算法:图论——深度优先搜索dfs

深度优先搜索dfs 提到深度优先搜索(dfs),就不得不说和广度优先搜索(bfs)有什么区别 根据搜索方式的不同,可以将图的遍历分为「深度优先搜索」和「广度优先搜索」。 深度优先搜索:从某一顶点出…

数组题解——​合并区间【LeetCode】

56. 合并区间 排序: 将所有区间按起始位置 start 从小到大排序。这样,重叠的区间会相邻排列,方便后续合并。 合并: 初始化一个空列表 merged,用于存储合并后的区间。遍历排序后的区间列表: 如果 merged 为…

关于高精度和链表的详细讲解(从属于GESP五级)

本章内容 高精度 链表 位数再多,只管稳稳进位,终会把答案写满。 一、高精度 1. 什么是高精度 • 定义 “高精度整数”指不受 C 原生整型 (int / long long) 位宽限制,而用数组模拟任意位数的大整数。 • 必要性 64 位 long long 仅能…

Python自动化框架选型指南:Selenium/Airflow/Celery该选谁?

在Python自动化领域,Selenium、Airflow和Celery是三个高频出现的工具,但它们的定位和适用场景截然不同。许多开发者在技术选型时容易混淆它们的边界,导致项目架构臃肿或功能不匹配。本文将通过对比分析,帮你明确不同场景下的最佳选择。 一、框架定位与核心功能对比 框架核…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrinkWater(喝水记录组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DrinkWater组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 语法结…

UAVAI-YOLO:无人机航拍图像的小目标检测模型

摘要 针对无人机航拍图像目标检测效果差的问题&#xff0c;提出改进的UAVAI-YOLO模型。首先&#xff0c;为使模型获得更加丰富的语义信息&#xff0c;使用改进可变形卷积网络&#xff08;deformable convolutional networks&#xff0c;DCN&#xff09;替换原骨干&#xff08…

Solidity 入门教程(一):Hello Web3,从一个字符串开始!

学习 Solidity 最好的方式&#xff0c;就是写出你的第一个合约&#xff01;在本篇文章中&#xff0c;我们将用极简的代码&#xff0c;通过 Remix 平台快速实现并运行一个 “Hello Web3!” 合约&#xff0c;正式迈入智能合约开发的大门。 一、什么是 Solidity&#xff1f; Sol…

串扰与包地

串扰与包地&#xff1a; 串扰与包地一直是业界非常关心的一个问题&#xff0c;围绕着它们的争论非常多&#xff0c;那到底是包地好 还是不包地好呢?高速先生尝试着从理论和实际测试上来给大家做一个分析。 为了验证它&#xff0c;高速先生做了以下几种情况&#xff0c;如图5-…

leetcode hot 100之:二叉树的最近公共祖先

本来不打算写的哈哈哈但是发现这一道递归我是有思路的&#xff01;&#xff01;自己能想到一些方向&#xff01;我真棒&#xff01;所以记录一下哈哈哈 我的思路&#xff1a; 1、祖先一定是自身或往上找&#xff0c;所以如何逆着走呢&#xff1f; 2、3种情况&#xff1a; 有…

【VUE】某时间某空间占用情况效果展示,vue2+element ui实现。场景:会议室占用、教室占用等。

某时间某空间占用情况效果展示&#xff0c;vue2element ui实现。场景&#xff1a;会议室占用、教室占用等。 场景说明&#xff1a; 现在需要基于vue2和el-table实现每日会议室个时间点占用情况。 已知数据&#xff1a; 1、会议室数据&#xff08;名称&#xff0c;id&#xff…

Git更换源方式记录

本文首发地址&#xff1a;https://www.dawnsite.cn/archives/198.html 该方式前提是本地项目已关联远程仓库&#xff0c;由于业务变更git地址改变 1. 移除本地已有远程仓库 git remote remove origin2. 添加新的远程仓库源 git remote add origin "clone地址"3.一步…

前端面试专栏-主流框架:12. Vue3响应式原理与API

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 Vue3响应式原理与API详解 一、引言 Vue3作为Vue.j…