⑴ Qt如何捕獲鍵盤事件
您好,Qt鍵盤事件屬於Qt事件系統,所以事件系統中所有規則對按鍵事件都有效。下面關注點在按鍵特有的部分:
focus
一個擁有焦點(focus)的QWidget才可以接受鍵盤事件。有輸入焦點的窗口是活動窗口或活動窗口子窗口或子子窗口等。
焦點移動的方式有以下幾種:
按下Tab或Shift+Tab
注意:文本編譯器(一般需要插入Tab),或者WebView(需要Tab來移動超鏈接焦點) 等
Qt中,需要輸入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
點擊一個QWidget
建議:只對接受文本輸入的Widget啟用該功能
按下鍵盤的快捷鍵
QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
使用滑鼠滾輪
用戶移動焦點
程序將決定被設置focus的Widget的哪一個子Widget獲得焦點
注意:如果一個 Widget 已經 grabKeyboard,所有鍵盤事件將發送到該Widget而不是獲得焦點的Widget
focusPolicy
一個QWidget獲得焦點的方式受 focusPolicy 控制
Qt::TabFocus
通過Tab鍵獲得焦點
Qt::ClickFocus
通過被單擊獲得焦點
Qt::StrongFocus
可通過上面兩種方式獲得焦點
Qt::NoFocus
不能通過上兩種方式獲得焦點(默認值),setFocus仍可使其獲得焦點
keypress和keyrelease
首先,我們要是Widget獲得焦點,一般設置focusPolicy。
然後要對按鍵進行響應,我們只需要直接重載:
keyPressEvent
keyReleaseEvent
注意:
對我們不處理的事件,要調用父類的相應事件處理函數。
如果widget當前沒有焦點,考慮到事件轉發:如果其子widget有焦點,那麼該widget未處理的鍵盤事件將被轉發過來。
有時輸入焦點不在任何窗口中。這種情況發生在所有程序都是最小化的時候。這時,Windows將繼續向活動窗口發送鍵盤消息,但是這些消息與發送給非最小化的活動窗口的鍵盤消息有不同的形式。
QKeyEvent
在windows下,與鍵盤事件有關的有8個消息:
對產生可顯示字元的按鍵組合,Windows不僅給程序發送按鍵消息,而且還發送字元消息
有些鍵不產生字元,這些鍵包括shift鍵、功能鍵、游標移動鍵和特殊字元鍵如Insert和Delete。對於這些鍵,Windows只產生按鍵消息。
這些消息在Qt中只體現在QKeyEvent中。
對字元,可通過 QKeyEvent::text() 獲得
其他鍵,QKeyEvent::key() 獲得一個鍵值
event函數
由於 Tab 鍵被用來切換焦點,這使得它與眾不同。
這是qwidget.cpp的event函數中的代碼片段:
case QEvent::KeyPress:
{
QKeyEvent *k = (QKeyEvent *)event;
bool res = false;
if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
{ //### Add MetaModifier?
if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
res = focusNextPrevChild(false);
else if (k->key() == Qt::Key_Tab)
res = focusNextPrevChild(true);
if (res)
break;
}
keyPressEvent(k);
}
如果我們需要處理Tab鍵,需要重載 event 函數。
⑵ qt事件過濾器能不能統一處理所有按鈕對象的事件
當一個事件產生時,Qt 通過實例化一個 QEvent 的合適的子類來表示它,然後通過調用 event() 函數發送給 QObject 的實例(或者它的子類)。
event() 函數本身並不會處理事件,根據事件類型,它將調用相應的事件處理函數,並且返回事件被接受還是被忽略。
一些事件,比如 QMouseEvent 和 QKeyEvent,來自窗口系統;有的,比如 QTimerEvent,來自於其他事件源;另外一些則來自應用程序本身。
⑶ qt中窗口對象的父子關系如何指定指定父對象有什麼作用及好處
每個對象構建的時來候都自可以在構造函數中進行父對象的指定,同時也可以用setParent的方式進行指定,
指定父對象的好處:
1、父對象在析構的時候,會連帶子對象全部釋放,如果非子對象則不進行析構,就需要手動進行析構。這樣比較麻煩。
2、這樣的析構處理只針對指針。
⑷ Qt中能捕獲到非當前窗口的滑鼠事件嗎
添加事件過濾器
⑸ Qt中父子窗口之間焦點傳遞
獲取那個按鈕,button->setFocus();就行了!
⑹ 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;
}
⑺ qt qlineedit怎樣使用事件過濾器
自己定義類繼承qlineedit, 實現eventFilter函數
⑻ QtCreator創建多窗體後,如何在父子窗體之間傳遞參數!
網上都有很多例子來說這個問題的, 但是他們舉的例子只適合動態創建子窗體的; 一般網上人說的例子都是用QtCreator創建一個主窗體,然後在主窗體中用代碼生成的子窗體, 這時候你直接在實例化子窗體時就可以直接把父窗體的指針傳遞給了子窗體, 這當然是容易的。 當然還是用SIGNAL/SLOT機制了, 但這里需要選擇合適的地方來用CONNECT函數來連接信號與槽函數。 這個方法, 我已經測試成功了; 而且效率相當不錯的。下面我只是簡單地說一下思路吧。 1. 創建子窗體時, 不要像主窗體創建時那樣把參數 (QWidget parent = 0),寫成這樣的話, 你自己找麻煩; 2. 如果你在子窗體里發送信號, 那麼你要設置自己的信號函數, 同時在父窗體中設置相應的槽函數。 子窗體: 定義發射的信號 class subclass : public QDialog{Q_OBJECTpublic:private:signals: void emit_your_signals(paramters);};父窗體: 定義接收信號的槽 class parent : public QWidget{Q_OBJECTpublic slots: void accept_your_signals(parameters);};然後在子窗體實體化時進行鏈接: ui-setupUI(){connect(subwindowpointer, signal, parentwindowpointer, slot);}即可以了以上都是簡化寫法, 突出信號與槽位置與關系; 剩下的就很簡單了, 在你的 子窗體實例化時
⑼ qt事件過濾器中為什麼同一個鍵盤事件連續觸發多次
添加個標記int flag = 0。每次接收到事件時判斷是否falg == 1,如果是就不做任何處理直接返回,否則將flag設為1並進行處理。在接收到按鍵彈起消息時再將falg重置為0.