Qt面试以及常用类继承关系图

6 篇文章 0 订阅

关于Qt的事件

  1. 事件的产生: 产生来源有timer事件外设的事件(mouseMoveEvent……),timer事件,滚轮事件,界面重绘制事件等等
  2. 事件的接受与处理:QObject对象,也就是Qt的所有对象可以通过重写protect的Event方法来对相应的时间进行接受以及处理
  3. 事件的分发:Gui程序由QApplication来分发,而非Gui程序由QCoreApplication来进行分发。他们利用eventLoop从事件队列中获取事件之后,将事件转义称为QEvents,分发给相应的QObject来进行处理。这个分发的过程在不同的平台有着不同的实现。
  4. 继承eventFilter()方法可以对事件进行处理:
bool FilterObject::eventFilter(QObject *object, QEvent *event)
{    
  if(event->type() == QEvent::KeyPress)
  {        
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);        
    if (keyEvent->key() == Qt::Key_Tab) 
    {
      // 处理Tab键           
      return true;       
    }
  }    
  return false;
}

eventFilter()的object参数表示事件发生的来源物件,eventFilter()若返回false,则安装该事件过滤器的对象的event()会继续执行,若返回true,则安装事件过滤器的对象后event()方法就不会被执行,由此进行事件的拦截处理。给本对象安装事件过滤器:this->installEventFilter(this);

关于信号与槽函数

  1. 信号与槽的连接比较灵活,可以一对一,一对多或者是多对一
  2. 信号与槽的绑定与解除也十分的灵活,使用connect以及disconnect就可以了
  3. 信号和槽可以用来实现线程之间的通信,
  4. 不能出现模版类参数以及宏定义等等
  5. 实际上性能根回调函数来比还是差很多的,大概是将近10倍的差距,如果对于实时性要求特别高的话不建议使用
  6. 这种机制对于程序代码害死有一定的精简作用的。

注意一下事件与信号槽的区别

  1. 一项区别在 于,事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在QT中,事件处理函数如果返回true,则这个事件处理 已完成,QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下一个可以处理该事件的注册方法。信号处 理函数的返回值对信号分派器来说是无意义的。
  2. 另外还有一个需要我们关注的问题是事件和信号处理时的优先级问题。在QT中,事件因为都是与窗口相关的,所以事件回调时都是从当前窗口开始,一级一级向上 派发,直到有一个窗口返回true,截断了事件的处理为止。对于信号的处理则比较简单,默认是没有顺序的。 在QT中,事件使用了一个事件队列来维护,如果事件的处理中又产生了新的事件,那么新的事件会加入到队列尾,直到当前事件处理完毕后, QApplication再去队列头取下一个事件来处理。而信号的处理方式有些不同,信号处理是立即回调的,也就是一个信号产生后,他上面所注册的所有槽 都会立即被回调。也就是说同一个时刻不相关的信号处理实际上没有严格的顺序区别。

关于常用的类

  • QMainWindow系列
  • QWidget系列类,继承体系如下所示:
    这里写图片描述
  • QThread类型以及QRunnable
  • 11
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值