当前位置: 首页 > news >正文

Qt 每日面试题 -2

11、Qt如果一个信号的处理方法一直未被执行有哪些可能性

  1. 断开了
  2. 连接的时候失败了
  3. 多线程的时候在排队或者启动锁死了

12、在Qt5的信号处理中如何使用lambda机制(可以代码示例)

信号定义了,但是不写对应槽函数,直接将函数写到槽的位置。
connect(musicPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(slotReflushStartTime(qint64));
connect(musicPlayer,SIGNAL(positionchanged(qint64)),slotReflushStartTime(qint64));直接就是将对象都不写了,直接写个函数。

13、段错误一般是什么原因造成的,如何快速排查

一般是指针的问题,出现野指针 空指针
排查: 打断点或者用Debug去排查问题

14、题目

#include<QApplication>
#include<QLabel>
#include<QWidget>
int main(int argc, char* argv0)
{QApplication hwApp(argc, argv);QLabel hwLabel("Hello world");QWidget window;hwLabel.setParent(&window);window.show();return hwApp.exec();
}

关闭界面时会异常退出,由于是在栈区创建之后会自己释放,所以程序结束时后创建先释放,所以这里是widget后创建先释放,导致label还没释放但是承载他的widget已经连带着自己和label释放了,但是label还做了内存管理,内存管理不会去判断是否已经释放了,就会出现自己再释放一次的问题;所以解决方法就是将widget先创建

15、Qt三大核心机制

  1. 信号槽
    connect(信号发出者,信号,信号接收者,槽,连接方式(隐藏默认自动连接));
  2. 元对象系统分为三大类:QObject类Q_OBJECT宏元对象编译器moc
  • Qt的类包含Q_OBJECT宏 moc编译器会对该类编译成标准的C++代码

  1. 事件模型
  • 1 事件的创建
    鼠标事件,键盘事件,窗口调整事件,模拟事件

  • 2 事件的交付
    Qt通过调用显函数QObject::event()来交付事件

  • 3 事件循环模型

    • 主事件循环通过调用QCoreApplication::exec()启动
    • 随着QCoreApplication::exit()结束
    • 本地的事件循环可用利用QEventLoop构建。
    • 一般来说,事件是由触发当前的窗口系统产生的,但也可以通过使用QCoreApplication::sendEvent()和QCoreApplication::postEvent()来手工产生事件。需要说明的是QCoreApplication::sendEvent()会立即发送事件,QCoreApplication::postEvent()则会将事件放在事件队列中分发。
  • 4自定义事件

16、Qt对象树

QT提供了对象树机制,能够自动、有效的组织和管理继承自QObject的对象
每个继承自QObject类的对象通过它的对象链表(QObjectList)来管理子类对象,当用户创建一个子对象时,其对象链表相应更新子类对象的信息对象链表可通过children()获取

当父类对象析构的时候,其对象链表中的所有(子类)对象也会被析构,父对象会自动,将其从父对象列表中删除,QT保证没有对象会被delete两次。开发中手动回收资源时建议使用deleteLater代替delete,因为deleteLater多次是安全的。

17、信号槽的四种写法和五种连接方式?

connect(信号发出者,信号,信号接收者,槽,连接方式(隐藏默认自动连接))

  • 信号和槽的四种写法∶

    • 1.用宏
      connect(this,SIGNAL(clicked()),this,SLOT(colse()));//连接方式(隐藏默认自动连接).

    • 2.用函数指针
      connect(this,&mainwindow::my_signal,this,&mainwindow::my_slot);

    • 3.用重载函数指针
      QOverloadconnect(this,QOverload<参数>::of(&mainwindow::my_signal),this,QOverload<参数>::of(&mainwindow::my_slot));

    • 4.lambda表达式(匿名函数)匿名函数代替槽
      connect( this,&mainwindow::my_signal,this,[=]{qDebug()<<100;});

  • 信号与槽五种连接方式:

    • 1 自动连接 (默认连接方式)
    • 2 直接连接 (用于单线程,自动匹配)
    • 3 队列连接 (用于多线程也可用于单线程,自动匹配)
    • 4 阻塞队列 (跨线程,多线程)
    • 5 唯一连接 (跨线程,多线程)

18、Qt模型

Qt中的View主要有三种:

QListView , QTreeView , QTabelView

对应的Model:

QStringListModel , QAbstractltemModel , QstandardltemModel。

19、Qt中的MVD(MVC)了解吧?

Qt的MVD包含三个部分Model(模型),View(视图),代理( Delegate ) 。

  • Model 负责保存数据
  • View 负责展示数据
  • Delegate 负责ltem样式绘制或处理输入

这三部分通过信号槽来进行通信,当Model中数据发生变化时将会发送信号到View,在View中编辑数据时,Delegate负责将编辑状态发送给Model层。 这三部分基类分别为QAbstractltemModel、QAbstractltemView、QAbstractltemDelegate。

Qt中提供了默认实现的MVD类,如QTableWidget、QListWidget、QTreeWidget等。

20、Qt如果要进行UDP网络编程首先需要添加哪些内容?

  1. .pro文件中添加QT +=network

  2. 在头文件中包含相关头文件
    #include <QHostInfo>
    #include <QNetworkInterface>

  3. QT的UdpSocket接收消息使用原则
    第一步 : new—个UdpSocket
    第二步 : 调用UdpSocket的bind方法同时指定端口号
    第三步 : 使用connect将接收消息函数和UdpSocket对象做关联
    第四步 : 在接受消息槽函数当中调用readDatagram接收消息


http://www.mrgr.cn/news/33281.html

相关文章:

  • K8S创建云主机配置docker仓库
  • WPF-控件的属性值的类型转化
  • 网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施
  • STM32问题集
  • 【JAVA】正则表达式中的中括弧
  • 从0开始学习机器学习--Day24--核函数
  • react:React Hook函数
  • 华为OD机试真题-IPv4地址转换成整数-2024年OD统一考试(E卷)
  • 打开C嘎嘎的大门:你好,C嘎嘎!(2)
  • 语言RPA流程组件介绍--获取网页信息
  • 上位机图像处理和嵌入式模块部署(linux小系统开发)
  • 字符串 下【KMP再续】
  • GitHub每日最火火火项目(9.22)
  • 【Elasticsearch系列十八】Ik 分词器
  • 解锁电商新视野:京东商品详情API——您的精准商品信息探索利器
  • Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略
  • AI学习指南深度学习篇-Adadelta简介
  • JavaScript(二)
  • 【Linux 从基础到进阶】 AWS云服务在Linux上的应用
  • C\C++内存管理详解
  • PHP在将数据存储到数据库之前如何转义数据
  • Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+源码+数据库)
  • 算法题之每日温度
  • python发送邮件 - email smtplib
  • SOMEIP_ETS_122: SD_Interface_Version
  • Linux文件IO(七)-复制文件描述符