Qt常见口试题合集

打印 上一主题 下一主题

主题 953|帖子 953|积分 2859


零、基本概念

什么是信号槽?

信号槽雷同于软件计划模式中的观察者模式,(观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到关照并被自动更新。)被观察者发出的信号(signal),观察者收到自己注册监听signal,就通过槽(slot)关联的槽函数function实现动作操纵。
信号槽的优缺点

(1)类型安全
信号的参数类型、参数个数需要和槽函数的参数类型和参数个数划一。槽函数的个数可以少于信号的参数个数,但缺少的参数必须是信号参数的最后一个或最后几个。
(2)疏松耦合
信号发送者不需要知道发出的信号被哪个对象的槽函数吸收,槽函数也不需要知道哪些信号关联了自己,Qt的信号槽机制保证了信号与槽函数的调用。支持信号槽机制的类或者父类必须继承于QObject。
(3)服从
信号槽增强了对象间通讯的灵活性,同时损失了一些性能,通过信号调用的槽函数比直接调用速度慢约10倍(因为需要定位信号吸收者;遍历所有关联;编组/解组转达的参数;多线程时,信号大概需要排队),这种调用速度对性能要求不是非常高的场景是可以忽略的,是满足绝大部分场景。
信号槽的用法和性子

  1. connect(sender, signal, receiver, slot);
复制代码
sender:发出信号的对象
signal:发送对象发出的信号
receiver:吸收信号的对象
slot:吸收对象在吸收到信号之后所需要调用的函数(槽函数)
系统自带的信号:
  1. void clicked(bool checked = false)
  2. void pressed()
  3. void released()
  4. void toggled(bool checked )
  5. signals inherited from Qwidget
  6. signals inherited from Q0bject
复制代码

  • 一个信号可以关联多个槽函数。
  • 多个信号可以关联一个槽函数
  • 一个信号可以关联另一个信号
  • 一个信号关联多个信号
一、Qt焦点机制


  • 信号与槽(Signals & Slots)

    • :Qt的信号槽机制与回调函数有何区别?


      • 解耦性:信号槽通过元对象系统(Meta-Object System)连接,发送者无需知道吸收者。
      • 参数类型安全:编译时检查参数类型(需用Q_DECLARE_METATYPE注册自定义类型)。
      • 多对多通讯:一个信号可连接多个槽,反之亦然。
      • 线程安全:支持跨线程通讯(自动选择Qt::AutoConnection模式)。


  • 元对象系统(Meta-Object System)

    • :moc(元对象编译器)的作用是什么?


      • 处理Q_OBJECT宏,天生moc_*.cpp文件,实现信号槽、动态属性、运行时类型信息(RTTI)等功能。
      • 支持qobject_cast进行安全的类型转换。



二、内存管理与对象模型


  • 父子对象机制

    • :Qt怎样管理对象的生命周期?


      • 通过QObject的父子关系:父对象析构时自动销毁所有子对象。
      • 示例:QWidget* child = new QWidget(parent);


  • 智能指针

    • :怎样在Qt中利用智能指针?


      • 利用QSharedPointer、QWeakPointer管理动态对象。
      • 留意:QObject及其子类通常依赖父子关系管理,需谨慎混合利用。



三、多线程与并发


  • QThread的两种用法

    • :继承QThread与利用moveToThread有何区别?


      • 子类化QThread:重写run()方法,适用于需要控制线程实行流程的场景。
      • moveToThread:将对象移动到新线程,通过信号槽触发逻辑(更符合事件驱动模型)。


  • 线程同步

    • :Qt中怎样实现线程同步?


      • 利用QMutex、QReadWriteLock、QSemaphore。
      • 跨线程通讯优先利用信号槽(自动排队或阻塞)。



四、事件处理与画图


  • 事件循环(Event Loop)

    • :表明Qt的事件处理流程。


      • 事件由QApplication进入事件队列。
      • QEventLoop逐一分发事件(如鼠标、键盘、定时器事件)。
      • 可重写event(QEvent*)或特定事件处理器(如mousePressEvent())。


  • 画图机制

    • :怎样利用QPainter进行自定义画图?


      • 在paintEvent()中利用QPainter绘制图形。
      • 双缓冲技能:通过QPixmap作为临时画布制止闪烁。



五、网络与模型视图编程


  • TCP/UDP通讯

    • :怎样实现Qt下的TCP客户端?


  1. QTcpSocket *socket = new QTcpSocket(this);
  2. socket->connectToHost("127.0.0.1", 1234);
  3. connect(socket, &QTcpSocket::readyRead, [=](){
  4.     QByteArray data = socket->readAll();
  5.     // 处理数据
  6. });
复制代码

  • 模型/视图框架

    • :QAbstractItemModel的作用是什么?


      • 提供数据接口供视图(如QListView)显示,分离数据与UI。
      • 需实现rowCount(), data(), setData()等方法。



六、实际场景问题


  • 调试与性能优化

    • :怎样检测Qt程序的内存泄漏?


      • 利用工具:Valgrind(Linux)、VLD(Windows)、Qt内置的qDebug()输出对象树。
      • 检查未准确父对象化的QObject。


  • 跨平台适配

    • :Qt怎样实现跨平台?


      • 抽象底层API(如OpenGL、DirectX),提供统一接口。
      • 利用Q_OS_WIN、Q_OS_LINUX等宏处理平台差异。



示例代码:信号槽连接

  1. // 声明
  2. class Worker : public QObject {
  3.     Q_OBJECT
  4. public slots:
  5.     void doWork() { /* ... */ }
  6. };
  7. // 连接
  8. QThread thread;
  9. Worker worker;
  10. worker.moveToThread(&thread);
  11. connect(&thread, &QThread::started, &worker, &Worker::doWork);
  12. thread.start();
复制代码

高频考点总结



  • 信号槽的5种连接方式:Qt::AutoConnection(默认)、DirectConnection、QueuedConnection等。
  • 事件过滤器:installEventFilter()拦截处理事件。
  • 国际化:利用tr()包裹字符串,配合.ts文件翻译。
  • 样式表(QSS):雷同CSS,定制控件外观。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表