[C++ GUI Programming with Qt4] chap7
Upcoming SlideShare
Loading in...5
×
 

[C++ GUI Programming with Qt4] chap7

on

  • 1,363 views

 

Statistics

Views

Total Views
1,363
Views on SlideShare
1,363
Embed Views
0

Actions

Likes
1
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

[C++ GUI Programming with Qt4] chap7 [C++ GUI Programming with Qt4] chap7 Presentation Transcript

  • C++ GUI Programming with Qt 4Chap7. Event Processing
  • Outline● 重新實現事件處理器● 安裝事件過濾器● 處理密集時的響應保持
  • 7.1 QEvent● The QEvent class is the base class of all event classes● Qts main event loop (QCoreApplication::exec()) fetches native window system events from the event queue, translates them into QEvents, and sends the translated events to QObjects. View slide
  • QWidget::event()● This is the main event handler; it handles event event● You can re-implement this function in a subclass, but we recommend using one of the specialized event handlers instead ( keyPressEvent(), mouseMoveEvent(), paintEvent(), etc... ). View slide
  • Common Event Types (1)● 鍵盤事件 : keyPressEvent(), keyReleaseEvent()
  • Tab & BackTab● 當安排的事件非預期行為時,利用重新實現 QObject::event() → QWidget::event() 在窗口 widget 調用 keyPressEvent() 之前,先攔截處 理
  • QAction, QShortcut● 利用 Action 當作 signal 發出者,綁定一個鍵盤 事件,然後 trigger 一個 slot 反應函數
  • Common Event Types (2)● 定時器事件● 大多數事件類型發生是因為用戶的動作,但定時 器事件允許應用程序在一定的時間間隔後執 行事件處理 ( 游標閃爍、動畫播放、簡單顯示 的刷新,等等 ...)
  • 跑馬燈範例● 利用 showEvent() 和 hideEvent() 啟動和關閉 定時器● timerEvent() 每隔若干時間會被呼叫● 當需要多個定時器時,保持對所有定時器 ID 的 追蹤會變得很麻煩。此時,更簡單的方式是為每 一個定時器分別建立一個 QTimer object 。
  • 7.2 Event Filter● QObject instance 在看到他自己的事件之前,可 以通過設置另外一個 QObject instance 監視 / 攔 截 這些事件● 當許多 Qt 物件需要針對某一致事件產生反應, 利用 Event Filter 機制,由另外一個 QObject 將 處理集中於一處。● InstallEventFilter(), eventFilter()
  • 5 levels event processing● 重新實現特殊的事件處理器 ● MousePressEvent(), keyPressEvent(), etc...● 重新實現 QObject::event() ● 覆蓋 Tab 鍵的預設語意● 在 QObject 中安裝事件過濾器● 在 QApplication object 中安裝事件過濾器 ● 應用程序中每個 object 的每個事件都會在發送到其他事件過 濾器之前,先發送給這個 eventFilter() 函數,適用於 debug 的時候● Subclassing Qapplication 並且重新實現 notify()
  • Event Propagation
  • 7.3 Staying Responsive● 處理一個事件時,也可能同時產生其他的事件,並且將 其追加到 Qt 的事件陣列中● 當處理一個特定事件上耗費的時間過多 (I/O 存取 ) ,用 戶介面就會變得無法響應● 解法 ● 1. 多線程 ● 2. 在 I/O 存取的代碼中頻繁調用 QApplication::processEvents() - 這個函數告訴 Qt 處理所有 那些還沒有被處理的各類事件,然後再將控制權返回給調用 者。實際上, QApplication::exec() 就是一個不停調用 processEvents() 的 while 循環
  • qApp->processEvents(QEventLoop::ExcludeUserInputEvents)告訴 Qt 忽略滑鼠和鍵盤事件
  • Defer the processing until the application is idle● 另一種處理耗時事件的方式:推遲至應用程式空 閒時再處理● 使用一個 0 毫秒定時器。只要沒有其他尚待處理 的事件,就觸發該定時器。