Qt 每日面试题 -4
31、继承与派生的区别?
- 角度不同
- 继承是从子类的角度讲的,派生是从基类的角度讲的。
- 定义不同
- 派生指江河的源头产生出支流。引申为从一个主要事物的发展中分化出来。继承是面向对象软件技术当中的一个概念,与多态、抽象共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
32、说出工厂模式概念和优点
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。 这满足创建型模式中所要求的 “创建与使用相分离" 的特点。简单工厂模式可以决定在什么时候创建哪一个产品类的实例。工厂方法模式有非常良好的扩展性。抽象工厂模式降低了模块间的耦合性,提高了团队开发效率。
33、说出构造者模式概念
构造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离。客户端无需知道具体的构造过程,只需要与构造器打交道即可,构建与表示分离。
34、说出适配器模式概念
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能在一起工作的那些类一起工作。
35、进程和线程的区别?
- 进程的定义:一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行程序的实例,包括程序计数器、寄存器和程序变量的当前值。简单来说,进程就是一个程序的执行流程,内部保存程序运行所需的资源。在操作系统中可以有多个进程在运行,可对于CPU来说,同一时刻,一个CPU只能运行一个进程,但在某一时间段内,CPU将这一时间段拆分成更短的时间片,CPU不停的在各个进程间游走,这就给人一种并行的错觉,像CPU可以同时运行多个进程一样,这就是伪并行。
- 线程的定义∶线程是进程当中的一条执行流程,这几乎就是进程的定义,一个进程内可以有多个子执行流程,即线程。 从资源组合的角度看,进程把一组相关的资源组合起来,构成一个资源平台环境,包括地址空间(代码段,数据段),打开的文件等各种资源。从运行的角度看︰进程是代码在这个资源平台上的执行流程,然而线程貌似也是这样,但是进程比线程多了资源内容列表;进程=线程+共享资源。
进程是操作系统分配资源的单位,线程是调度的基本单位,线程之间共享进程资源。
36、进程之间的道信方式有哪些?
- 管道
- 消息队列
- 共享内存
- 信号量
- 套接字
- 文件
37、信号和信号量的区别是什么?
-
信号 : 一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接收进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。
-
信号量 : 进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施,它负责协调各个线程,以保证它们能够正确,合理的使用公共资源。
38、多线程情况下,Qt中的信号槽分别在什么线程中执行,如何控制?
通过connect函数的第五个参数connectType来控制。
- connect用于连接qt的信号和槽,在qt编程过程中不可或缺。它其实有第五个参数,只是一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。
lightseagreen
-
Qt::AutoConnection :默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt:DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt:QueuedConnection类型。
-
Q::DirectConnection :槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。
-
Qt::QueuedConnection :槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。
-
Qt::BlockingQueuedConnection :槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
-
Qt::UniqueConnection :这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。
39、QSS平时使用的多吗?能举几个例子吗?
- 将QSS统一写在一个文件中,通过程序给主窗口加载;
- 写成一个字符串中,通过程序给主窗口加载;
- 需要使用的地方,写一个字符串,加载给对象;
- QT Designer(ui)中填写;
40、Qt程序是事件驱动的,事件到处都可以遇到。能说说平时经常使用到哪些事件吗?
常见的QT事件类型如下:
- 键盘事件: 按键按下和松开
- 鼠标事件: 鼠标移动,鼠标按键的按下和松开
- 拖放事件: 用鼠标进行拖放
- 滚轮事件: 鼠标滚轮滚动
- 绘屏事件: 重绘屏幕的某些部分
- 定时事件: 定时器到时
- 焦点事件: 键盘焦点移动
- 进入和离开事件: 鼠标移入widget之内,或是移出
- 移动事件: widget的位置改变
- 大小改变事件: widget的大小改变
- 显示和隐藏事件: widget显示和隐藏
- 窗口事件: 窗口是否为当前窗口