C++面试八股文(Qt 常见问题)
1. 如何解决 Qt 中文乱码问题?
面试回答:Qt 中文乱码通常由编码不一致导致,常见解决方式包括:
- 源文件统一使用 UTF-8 编码
- 在 Qt 5 中使用
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")) - Qt 6 默认使用 UTF-8,一般无需额外设置
- 界面字符串使用
QStringLiteral()或tr() - 文件读写时显式指定编码(如
QTextStream::setCodec("UTF-8"))
2. 如何解决 Qt 程序在高分屏下显示模糊的问题?
面试回答:高分屏模糊主要与 DPI 缩放有关,解决方法包括:
- 在程序启动前开启高 DPI 支持:Qt::AA_EnableHighDpiScalingQt::AA_UseHighDpiPixmaps
- 使用矢量资源(SVG)替代位图
- 避免硬编码像素尺寸,使用布局管理器
- Qt 6 默认启用高 DPI,问题相对较少
3. 如何解决 Qt 程序假死的问题?
面试回答:Qt 程序假死通常是 主线程阻塞 导致的:
- 避免在 UI 线程中执行耗时操作
- 将耗时任务放入 子线程(QThread / QtConcurrent)
- 使用异步 IO 或信号槽通信
- 合理使用
QCoreApplication::processEvents()(避免滥用)
4. 信号槽连接失败的常见原因有哪些?
面试回答:
- 信号和槽函数签名不匹配
- 对象未继承
QObject - 缺少
Q_OBJECT宏 - 对象已被销毁
- 使用字符串形式
connect()时拼写错误 - 跨线程对象未使用合适的连接类型
5. Qt 程序崩溃的常见原因有哪些?
面试回答:
- 空指针或野指针访问
- 对象已销毁但仍被使用
- 跨线程操作 UI
- 数组越界
- 信号槽异步访问已释放对象
- 第三方库不兼容
6. 如何解决 Qt 程序内存泄漏问题?
面试回答:
- 利用
QObject父子对象机制自动释放 - 避免频繁使用
new/delete - 使用智能指针管理非 QObject 对象
- 检查信号槽循环引用
- 使用工具(Valgrind、ASan)检测泄漏
7. 如何解决 Qt 界面卡顿问题?
面试回答:
- 减少 UI 线程中的计算逻辑
- 批量更新界面,避免频繁刷新
- 使用
setUpdatesEnabled(false) - 对大量数据显示使用 Model/View
- 启用硬件加速(Qt Quick / OpenGL)
8. 如何解决 Qt 多线程中的数据竞争问题?
面试回答:
- 使用
QMutex、QReadWriteLock保护共享数据 - 使用信号槽进行线程间通信,避免直接访问
- 使用
Qt::QueuedConnection - 避免多个线程同时写同一数据
- 尽量采用“数据拷贝 + 消息传递”模型
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
