1. 程式人生 > >Qt面試以及常用類繼承關係圖

Qt面試以及常用類繼承關係圖

關於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