review
.ui生成.h.cpp檔案
uicform1.ui-oform1.h
uicform1.ui-iform1.h-oform1.cpp
c++三個特點:繼承過載封裝
qt事件
qt程式是事件驅動的,程式的每個動作都是由幕後某個事件所觸發.
qt事件的型別很多,常見的qt的事件如下:
鍵盤事件:按鍵按下和鬆開.
滑鼠事件:滑鼠移動,滑鼠按鍵的按下和鬆開.
拖放事件:用滑鼠進行拖放.
滾輪事件:滑鼠滾輪滾動.
繪屏事件:重繪螢幕的某些部分.
定時事件:定時器到時.
焦點事件:鍵盤焦點移動.
進入和離開事件:滑鼠移入widget之內,或是移出.
移動事件:widget的位置改變.
大小改變事件:widget的大小改變.
顯示和隱藏事件:widget顯示和隱藏.
視窗事件:視窗是否為當前視窗.
還有一些非常見的qt事件,比如socket事件,剪貼簿事件,字型改變,布局改變等等.
qt的事件和qt中的signal不一樣.後者通常用來使用widget,而前者用來實現widget.
比如乙個按鈕,我們使用這個按鈕的時候,我們只關心他clicked()的signal,至於這個按鈕如何接收處理滑鼠事件,再發射這個訊號,我們是不用關心的.但是如果我們要過載乙個按鈕的時候,我們就要面對event了.比如我們可以改變它的行為,在滑鼠按鍵按下的時候(mousepressevent)就觸發clicked()的signal而不是通常在釋放的(mousereleaseevent)時候.
事件起源:
基於事件如何被產生與分發,可以把事件分為三類:
1)spontaneous事件
2)posted事件
3)sent事件
1)spontaneous事件,由視窗系統產生,它們被放到系統佇列中,通過事件迴圈逐個處理。
本類事件通常是windowsystem把從系統得到的訊息,比如滑鼠按鍵,鍵盤按鍵等,放入系統的訊息佇列中.qt事件迴圈的時候讀取這些事件,轉化為qevent,再依次處理.
2)posted事件,由qt或是應用程式產生,它們被qt組成佇列,再通過事件迴圈處理。
例如:qwidget::update()函式
當需要重新繪製螢幕時,程式呼叫update()函式
3)sent事件由qt或是應用程式產生,但它們被直接傳送到目標物件。
sent型別事件不會放入佇列,而是直接被派發和處理,qwidget::repaint()函式用的就是這種方式.
事件迴圈如下面所示:
while(!exit_was_called)
while(!posted_event_queue_is_empty)
process_next_posted_event();
while(!spontaneous_event_queue_is_empty)
process_next_spontaneous_event();
while(!posted_event_queue_is_empty)
process_next_posted_event();
事件迴圈的處理流程:
1)先處理qt事件佇列中的posted事件,直至為空
2)再處理系統訊息佇列中的spontaneous訊息,直至為空
3)在處理系統訊息的時候會產生新的qtposted事件,需要對其再次進行處理
不通過事件迴圈
notify
它是通過呼叫receiver->event(event)來實現的。
目標接受物件的event方法會自動接受notify傳來的event事件
event()會返回乙個布林值,來告訴呼叫者是否事件被accept或ignore,
event()函式的處理如下所示:
boolqwidget::event(qevent*event)
switch(e->type())else /* * destroys the object and frees any allocated resources */ form1::~form1() /* * sets the strings of the subwidgets using the current * language. */ void form1::languagechange() void form1::next() void form1::press_next() void form1::keypressevent ( qkeyevent * e ) void form1:: mousemoveevent ( qmouseevent * e ) }
form2.cpp
#include "form2.h" #include "form1.h" #include #include #include #include #include #include #include #include /* * constructs a form2 as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * the dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ form2::form2( qwidget* parent, const char* name, bool modal, wflags fl ) : qdialog( parent, name, modal, fl ) /* * destroys the object and frees any allocated resources */ form2::~form2() /* * sets the strings of the subwidgets using the current * language. */ void form2::languagechange() void form2::back() ; void form2::press_back() void form2::keypressevent ( qkeyevent * e )
QT程式設計 事件(二)
qt事件模型乙個真正強大的特色是乙個 qobject 的例項能夠管理另乙個 qobject 例項的事件。乙個customerdialog 的小部件。customerdialog 包含一系列 qlineedit.現在,我們想用空格鍵來代替 tab,使焦點在這些 qlineedit 間切換。乙個解決的方...
Qt 事件機制(一)
每種事件對應乙個事件處理器,如滑鼠移動對應mousemoveevent 在發生事件時 比如說上面說的按下滑鼠 就會產生乙個qevent物件,這個qevent物件會傳給當前元件的event函式 qt系統在處理事件時,有一種機制叫事件傳播機制。也就是說,在子元件 比如說乙個qbutton 中發生的事件,...
Qt事件 changeEvent(改變事件)
改變事件changeevent qevent e 繼承自qwidget 以下事件的變化會觸發changeevent qevent change,工具欄的按鈕被按下 qevent activationchange,活動狀態變化 qevent enabledchange,可用 不可用改變 qevent ...