C++ Qt基础面试题
1. 什么是Qt?Qt有哪些特点?
答案:
- Qt定义跨平台C++图形用户界面应用程序框架由Qt Company开发和维护支持Windows、Linux、macOS、Android、iOS等
- 主要特点跨平台:一次编写,到处编译面向对象:基于C++,完全面向对象丰富的API:GUI、网络、数据库、XML等信号槽机制:独特的对象通信方式国际化支持:多语言界面开源和商业双授权:LGPL和商业许可
- Qt模块Qt Core:核心非GUI功能Qt GUI:GUI组件基础Qt Widgets:桌面UI组件Qt Network:网络编程Qt SQL:数据库集成Qt Multimedia:多媒体Qt Quick:QML声明式UI
- 应用场景桌面应用程序嵌入式系统移动应用工业控制
C++面试题合集 : https://www.nowcoder.com/creation/manager/columnDetail/MJ4oG8
2. 什么是信号和槽?如何使用?
答案:
- 定义Qt的核心机制,用于对象间通信信号(Signal):事件发生时发出槽(Slot):响应信号的函数松耦合,类型安全
- 基本使用
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget() {
QPushButton* button = new QPushButton("Click", this);
// 连接信号和槽
connect(button, &QPushButton::clicked,
this, &MyWidget::onButtonClicked);
}
private slots:
void onButtonClicked() {
qDebug() << "Button clicked!";
}
};
- 连接方式
// 1. 传统方式(Qt4)
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
// 2. 函数指针方式(Qt5,推荐)
connect(sender, &Sender::signal, receiver, &Receiver::slot);
// 3. Lambda表达式
connect(button, &QPushButton::clicked, [=]() {
qDebug() << "Clicked!";
});
- 特点一个信号可以连接多个槽多个信号可以连接同一个槽信号可以连接信号连接可以是跨线程的类型安全(Qt5函数指针方式)
3. Q_OBJECT宏的作用是什么?
答案:
- 作用启用Qt的元对象系统必须放在类声明的开头使类支持信号槽机制
- 提供的功能信号和槽属性系统(Q_PROPERTY)对象树和父子关系运行时类型信息(RTTI)动态属性对象名称
- 使用示例
class MyClass : public QObject {
Q_OBJECT // 必须在最前面
public:
MyClass(QObject* parent = nullptr);
signals:
void mySignal();
private slots:
void mySlot();
};
- 注意事项必须继承自QObject或其子类类定义必须在.h文件中需要运行moc(元对象编译器)不能用于模板类
4. Qt的对象树和内存管理是什么?
答案:
- 对象树机制父对象管理子对象的生命周期父对象销毁时自动销毁所有子对象避免内存泄漏
- 使用示例
QWidget* parent = new QWidget();
QPushButton* button = new QPushButton("Click", parent); // 指定父对象
QLabel* label = new QLabel("Text", parent);
// 只需要删除父对象
delete parent; // button和label自动删除
- 内存管理规则有父对象的QObject不需要手动delete没有父对象的需要手动管理栈对象自动管理使用智能指针管理无父对象的堆对象
- 最佳实践
// 好:指定父对象
QLabel* label = new QLabel("Text", this);
// 好:栈对象
void func() {
QLabel label("Text");
}
// 需要注意:无父对象
QLabel* label = new QLabel("Text");
// 需要手动delete或使用智能指针
5. Qt中的事件机制是什么?
答案:
- 事件系统Qt使用事件驱动模型事件由QEvent类及其子类表示事件循环处理事件队列
- 事件类型鼠标事件:QMouseEvent键盘事件:QKeyEvent绘制事件:QPaintEvent定时器事件:QTimerEvent自定义事件:继承QEvent
- 事件处理方式
class MyWidget : public QWidget {
protected:
// 1. 重写事件处理函数
void mousePressEvent(QMouseEvent* event) override {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left button pressed";
}
QWidget::mousePressEvent(event); // 调用基类
}
// 2. 重写event()函数
bool event(QEvent* event) override {
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
// 处理按键
return true; // 事件已处理
}
return QWidget::event(event);
}
// 3. 安装事件过滤器
bool eventFilter(QObject* obj, QEvent* event) override {
if (obj == targetWidget && event->type() == QEvent::MouseMove) {
// 处理事
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

查看29道真题和解析