當前位置:首頁 » 凈水方式 » qt事件過濾器

qt事件過濾器

發布時間: 2021-03-24 19:41:22

1. qwebview觸屏事件被過濾了怎麼辦

設置事件過濾器時用設置其viewport的事件專過濾
實例:屬

#include <QtGui>
#include <QtDebug>
QTextEdit* pEdit = new QTextEdit(this);
pEdit->viewport()->installEventFilter(this);
bool xxx::eventFilter(QObject* o, QEvent* e)
{
Q_UNUSED(o);
if(e->type() == QEvent::MouseButtonPress){
QMouseEvent* pMe = static_cast<QMouseEvent*>(e);
qDebug() << pMe->pos();
}
return false;
}

2. qt事件過濾器能不能統一處理所有按鈕對象的事件

當一個事件產生時,Qt 通過實例化一個 QEvent 的合適的子類來表示它,然後通過調用 event() 函數發送給 QObject 的實回例(或者它的子答類)。
event() 函數本身並不會處理事件,根據事件類型,它將調用相應的事件處理函數,並且返回事件被接受還是被忽略。
一些事件,比如 QMouseEvent 和 QKeyEvent,來自窗口系統;有的,比如 QTimerEvent,來自於其他事件源;另外一些則來自應用程序本身。

3. qt qlineedit怎樣使用事件過濾器

自己定義類繼承qlineedit, 實現eventFilter函數

4. qt的installeventfilter怎麼用

1. 在Cpp中對某一個對象 obj->installeventfilter(this), 即是對此對象安裝了本對象(*this)的事件過濾器
2. 在(*this)的Cpp中重載bool QObject::eventFilter(QObject * watched, QEvent * event)
3. 再判斷watched == obj, 然後獲取event->type()的值是否需要事件.

5. 關於Qt的事件過濾器

monitoredObj是你要監控事件的對象filterObj是你要在里邊進行處理對象名

6. qt事件過濾器中為什麼同一個鍵盤事件連續觸發多次

添加個標記int flag = 0。每次接收到事件時判斷是否falg == 1,如果是就不做任何處理直接返回,否則將flag設為1並進行處理。在接收到按鍵彈起消息時再將falg重置為0.

7. QT的事件和信號的區別

signal由具體對象發出,然後會馬上交給由connect函數連接的slot進行處理;而對於事件,Qt使用一個事件隊列對所有發出的事件進行維護,當新的事件產生時,會被追加到事件隊列的尾部,前一個事件完成後,取出後面的事件進行處理。但是,必要的時候,Qt的事件也是可以不進入事件隊列,而是直接處理的。並且,事件還可以使用「事件過濾器」進行過濾。總的來說,如果我們使用組件,我們關心的是信號槽;如果我們自定義組件,我們關心的是事件。因為我們可以通過事件來改變組件的默認操作。比如,如果我們要自定義一個QPushButton,那麼我們就需要重寫它的滑鼠點擊事件和鍵盤處理事件,並且在恰當的時候發出clicked()信號。
還記得我們在main函數裡面創建了一個QApplication對象,然後調用了它的exec()函數嗎?其實,這個函數就是開始Qt的事件循環。在執行exec()函數之後,程序將進入事件循環來監聽應用程序的事件。當事件發生時,Qt將創建一個事件對象。Qt的所有事件都繼承於 QEvent類。在事件對象創建完畢後,Qt將這個事件對象傳遞給QObject的event()函數。event()函數並不直接處理事件,而是按照事件對象的類型分派給特定的事件處理函數(event handler)。
在所有組件的父類QWidget中,定義了很多事件處理函數,如keyPressEvent()、
keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。這些函數都是protected virtual的,也就是說,我們應該在子類中重定義這些函數。

8. qt4 tableWidget 怎麼給每個單元格加上時間過濾器installEventFilter分數沒用我送幾個Q幣好了

Qt的事件模型一個強大的功能是一個QObject對象能夠監視發送其他QObject對象的事件,在事件到達之前對其進行處理。
假設我們有一個CustomerInfoDialog控制項,由一些QLineEdit控制項組成。我們希望使用Space鍵得到下一個QLineEdit的輸入焦點。一個最直接的方法是繼承QLineEdit重寫keyPressEvent()函數,當點擊了Space鍵時,調用focusNextChild():
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Space) {
focusNextChild();
} else {
QLineEdit::keyPressEvent(event);
}
}
這個方法有一個最大的缺點:如果我們在窗體中使用了很多不同類型的控制項(QComboBox,QSpinBox等等),我們也要繼承這些控制項,重寫它們的keyPressEvent()。一個更好的解決方法是讓CustomerInfoDialog監視其子控制項的鍵盤事件,在監視代碼處實現以上功能。這就是事件過濾的方法。實現一個事件過濾包括兩個步驟:
1. 在目標對象上調用installEventFilter(),注冊監視對象。
2. 在監視對象的eventFilter()函數中處理目標對象的事件。
注冊監視對象的位置是在CustomerInfoDialog的構造函數中:
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)
: QDialog(parent)
{
...
firstNameEdit->installEventFilter(this);
lastNameEdit->installEventFilter(this);
cityEdit->installEventFilter(this);
phoneNumberEdit->installEventFilter(this);
}
事件過濾器注冊後,發送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit控制項的事件首先到達CustomerInfoDialog::eventFilter()函數,然後在到達最終的目的地。
下面是eventFilter()函數的代碼:
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{
if (target == firstNameEdit || target == lastNameEdit
|| target == cityEdit || target == phoneNumberEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast(event);
if (keyEvent->key() == Qt::Key_Space) {
focusNextChild();
return true;
}
}
}
return QDialog::eventFilter(target, event);
}
首先,我們看是目標控制項是否為QLineEdit,如果事件為鍵盤事件,把QEvent轉換為QKeyEvent,確定被敲擊的鍵。如果為Space鍵,調用focusNextChild(),把焦點交給下一個控制項,返回true通知Qt已經處理了這個事件,如果返回false,Qt將會把事件傳遞給目標控制項,把一個空格字元插入到QLineEdit中。
如果目標控制項不是QLineEdit,或者事件不是Space敲擊事件,把控制權交給基類QDialog的eventFilter()。目標控制項也可以是基類QDialog正在監視的控制項。(在Qt4.1中,QDialog沒有監視的控制項,但是Qt的其他控制項類,如QScrollArea,監視一些它們的子控制項)

Qt的事件處理有5中級別:
1. 重寫控制項的事件處理函數:如重寫keyPressEvent(),mousePressEvent()和paintEvent(),這是最常用的事件處理方法,我們已經看到過很多這樣的例子了。
2. 重寫QObject::event(),在事件到達事件處理函數時處理它。在需要改變Tab鍵的慣用法時這樣做。也可以處理那些沒有特定事件處理函數的比較少見的事件類型(例如,QEvent::HoverEnter)。我們重寫event()時,必須要調用基類的event(),由基類處理我們不需要處理的那些情況。
3. 給QObject對象安裝事件過濾器:對象用installEventFilter()後,所有達到目標控制項的事件都首先到達監視對象的eventFilter()函數。如果一個對象有多個事件過濾器,過濾器按順序激活,先到達最近安裝的監視對象,最後到達最先安裝的監視對象。
4. 給QApplication安裝事件過濾器,如果qApp(唯一的QApplication對象)安裝了事件過濾器,程序中所有對象的事件都要送到eventFilter()函數中。這個方法在調試的時候非常有用,在處理非活動狀態控制項的滑鼠事件時這個方法也很常用。
5. 繼承QApplication,重寫notify()。Qt調用QApplication::nofity()來發送事件。重寫這個函數是在其他事件過濾器處理事件前得到所有事件的唯一方法。通常事件過濾器是最有用的,因為在同一時間,可以有任意數量的事件過濾器,但是notify()函數只有一個。
許多事件類型,包括滑鼠,鍵盤事件,是能夠傳播的。如果事件在到達目標對象的途中或者由目標對象處理掉,事件處理的過程會重新開始,不同的是這時的目標對象是原目標對象的父控制項。這樣從父控制項再到父控制項,知道有控制項處理這個事件或者到達了最頂級的那個控制項。
圖7.2顯示了一個鍵盤事件在一個對話框中從子控制項到父控制項的傳播過程。當用戶敲擊一個鍵盤,時間首先發送到有焦點的控制項上(這個例子中是QCheckBox)。如果QCheckBox沒有處理這個事件,Qt把事件發送到QGroupBox中,如果仍然沒有處理,則最後發送到QDialog中。

9. Qt中eventFilter事件無法過濾QTextEdit中的mousePreessEvent事件,這是為什麼

設置事件過濾器時用設置其viewport的事件過濾

實例:

#include<QtGui>
#include<QtDebug>
QTextEdit*pEdit=newQTextEdit(this);
pEdit->viewport()->installEventFilter(this);
boolxxx::eventFilter(QObject*o,QEvent*e)
{
Q_UNUSED(o);
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent*pMe=static_cast<QMouseEvent*>(e);
qDebug()<<pMe->pos();
}
returnfalse;
}
熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239