QT程式設計 事件(一)

2021-08-26 11:22:46 字數 3100 閱讀 7211

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 ...