事件過濾器及不規則窗體

2021-10-05 01:45:30 字數 2406 閱讀 4598

有時候, 物件需要檢視、 甚至要攔截傳送到另外物件的事件。 例如, 對話方塊可能

想要攔截按鍵事件, 不讓別的元件接收到; 或者要修改回車鍵的預設處理。

我們已經知道,qt 建立了 qevent 事件物件之後, 會呼叫 qobject的 event()函式處理事件的分發。 顯然, 我們可以在 event()函式中實現攔截的操作。

由於 event()函式是 protected 的, 因此, 需要繼承已有類。 如果元件很多, 就需

要重寫很多個 event()函式。 這當然相當麻煩, 更不用說重寫 event()函式還得小心

一堆問題。 好在 qt 提供了另外一種機制來達到這一目的:事件過濾器

1. 事件過濾器

qobject 有乙個 eventfilter()函式, 用於建立事件過濾器。 函式原型如下

virtual

bool qobject::eventfilter ( qobject * watched, qevent * event )

;

這個函式正如其名字顯示的那樣, 是乙個「事件過濾器」。所謂事件過濾器, 可以

理解成一種過濾**事件過濾器會檢查接收到的事件。 如果這個事件是我們感興趣的型別, 就進行我們自己的處理; 如果不是, 就繼續**。 這個函式返回乙個 bool 型別, 如果你想將引數 event 過濾出來, 比如, 不想讓它繼續**, 就返回 true, 否則返回 false事件過濾器的呼叫時間是目標物件(也就是引數裡面的 watched 物件) 接收到事件物件之前。 也就是說, 如果你在事件過濾器中停止了某個事件, 那麼, watched 物件以及以後所有的事件過濾器根本不會知道這麼乙個事件。

我們來看一段簡單的**:

class

mainwindow

:public qmainwindow

;mainwindow::

mainwindow()

bool mainwindow::

eventfilter

(qobject *obj, qevent *event)

else

}else

}

void qobject::installeventfilter ( qobject * filterobj )
bool customwidget::

event

(qevent *e)

}return qwidget::

event

(e);

}

現在, 我們可以給出乙個使用事件過濾器的版本:

bool filterobject::

eventfilter

(qobject *object, qevent *event)

else

}return

false

;}

常見的窗體是各種方形的對話方塊,但有時候也需要非方形的窗體,如圓形,橢圓甚至是不規則形狀的對話方塊。

實現步驟:

//新建乙個 pixmap 物件

qpixmap pixmap;

//載入

pixmap.

load

(":/new/prefix1/image/sunny.png");

//固定視窗大小, 將視窗大小設定為大小

setfixedsize

( pixmap.

width()

, pixmap.

height()

);//給視窗去掉邊框, 設定視窗的 flags

setwindowflags

(qt::framelesswindowhint |

windowflags()

);//設定透明背景

setattribute

(qt::wa_translucentbackground)

;

void sharewidget::

mousepressevent

(qmouseevent *ev)

if(ev-

>

button()

== qt::rightbutton)

}void sharewidget::

mousemoveevent

(qmouseevent *ev)

}void sharewidget::

paintevent

(qpaintevent *ev)

事件過濾器

2009 11 22 12 21 40 標籤 c 學習教程 qt教程qt 原始出處 作者資訊和本宣告。否則將追究法律責任。qt建立了qevent事件物件之後,會呼叫qobject的event 函式做事件的分發。有時候,你可能需要在呼叫event 函式之前做一些另外的操作,比如,對話方塊上某些元件可能...

事件過濾器

正常情況下,被qwidget看成是去移動 鍵盤焦點,但少數視窗部件需要自行解釋。讓我們試著設想已經有了乙個customerinfodialog的小部件。customerinfodialog 包含一系列qlineedit.現在,我們想用空格鍵來代替tab,使焦點在這些qlineedit間切換。乙個解決...

事件過濾器

6.1哪個控制項需求過濾事件 就給哪個控制項安裝過濾器 6.2步驟1 安裝過濾器 ui label t installeventfilter this 6.4 步驟2 6.4.1 重寫事件 給ui label做事件過濾器攔截 步驟1 給控制項安裝過濾器 通過父視窗給label安裝過濾器 ui lab...