Qt面试常问

1.QT信号与槽的底层原理?

  • 底层通过元对象系统事件循环 完成的,能够在运行期间动态处理信号槽之间的连接与断开,而不是像函数调用那样在编译期间就完全确定了。
  • 元对象系统包含:QObject类、Q_OBJECT宏定义、moc编译器
  • 当发送一个信号,由moc编译器生成一个函数,这个函数会根据信号的签名找到所有的槽函数,并把信号的参数传递给槽
  • 信号本质上是一个函数,但他并不调用槽函数,而是通过QT内部机制间接调用,这种间接性也让信号槽跨线程工作,甚至运行时可以动态地连接与断开。

2.想要声明和使用信号槽需要哪些前提条件?

  • 继承Object类
  • 私有作用域下需要Q_OBJECT这个宏定义

3.信号槽是什么?

信号与槽(Signals & Slots) 是一种用于对象间通信的机制,它是 Qt 的核心特性之一。

基本语法:QObejct::connect(发送者指针, &发送者类::信号, 接收者指针, &接收者类::槽);

4.connection槽函数的连接方式:

  • 自动连接(Auto Connection):

默认的连接方式,发送和接收者在同一个线程中,自动使用直接连接,不在同一个线程中,使用队列连接

  • 直接连接(Direct Connection):

同一线程中使用,信号发送时,槽函数就被调用,效果就像同步的函数调用。

  • 队列连接(Queued Connection):

同一或不同线程中使用,信号发送后会被暂时放在消息队列中(发送者线程不阻塞),需要接收对象所属的线程事件循环有控制权了才能获取信号,执行槽函数。

  • 阻塞连接(Blocking Queued Connection):

只能在不同线程中使用(同一线程中会死锁),调用过程和上一个一致,不过发送者发送信号后所在线程会阻塞,直到槽函数运行完。

  • 唯一连接(Unique Connection):

作为与上面四个进行按位或的,避免重复连接。

5.Qt中的.pro文件是什么

工程文件,在其中声明依赖的模块,通过qmake自动链接库文件。

比如我的项目中使用了TCP协议通信(UDP、HTTP、SSL都行),需要定义库文件#include<QTcpSocekt>和#include<QTcpServer>时,需要在.pro工程文件中加入网络模块:QT+=network

6.为什么当前父类下子类new出的对象不必析构?

Qt对象树模型中,父类销毁,子类也会销毁,所以子类的new出来的对象不用管

相关推荐
玖玥拾14 分钟前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾33 分钟前
Rust 学习目录
开发语言·学习·rust
云泽8081 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦1 小时前
GO---可见性规则
开发语言·golang
逝水无殇1 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子2 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ3 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香3 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI3 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second603 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++