QT 按鍵處理 快捷鍵處理 shift + ctrl

原味地址:http://www.cnblogs.com/codingmylife/archive/2010/08/30/1812739.html

CTRL+Enter發送信息的實現

在現在的即時聊天程序中,一般都設置有快捷鍵來實現一些常用的功能,類似QQ可以用CTRL+Enter來實現信息的發送。

在QT4中,所有的事件都繼承與QEvent這個類,以下是用QEvent來實現快捷鍵的功能。

首先所有QT類的基類QObject有一個成員函數installEventFilter,這個函數是用來將一個事件處理器和該QObject綁定起來,所以就有了我下面的想法。

首先在chat類定義一個eventFilter,該函數是一個虛函數,可以由子類進行更改。所以聲明eventFilter如下:

virtual bool eventFilter(QObject *obj, QEvent *e);

看了下QT文檔對於這個函數的聲明的解釋,大概意思就是如果你要過濾某個事件就返回false,如果要使用某個事件就返回true。

我想在這個函數中加入對Enter鍵和Ctrl+Enter組合鍵的判斷,具體查看QKeyEvent類的文檔

QKeyEvent類中有函數key和modifier,key函數返回的是發生時間的按鍵值,modifier返回的而是修飾鍵,QT所支持的修飾鍵如下:

Constant Value Description

Qt::NoModifier 0x00000000 No modifier key is pressed.

Qt::ShiftModifier 0x02000000 A Shift key on the keyboard is pressed.

Qt::ControlModifier 0x04000000 A Ctrl key on the keyboard is pressed.

Qt::AltModifier 0x08000000 An Alt key on the keyboard is pressed.

Qt::MetaModifier 0x10000000 A Meta key on the keyboard is pressed.

Qt::KeypadModifier 0x20000000 A keypad button is pressed.

Qt::GroupSwitchModifier 0x40000000 X11 only. A Mode_switch key on the keyboard is pressed.

所以可以重寫eventFilter函數來實現快捷鍵的功能,可以根據QKeyEvent的key和modifire來分別是Enter還是Ctrl+enter被按下。

重寫eventFilter的函數如下:

 bool Window::eventFilter(QObject *obj, QEvent *e)
 {
 Q_ASSERT(obj == ui.inputMsgEdit);

 
 if (e->type() == QEvent::KeyPress)
 {
 QKeyEvent *event = static_cast(e);
 if (event->key() == Qt::Key_Return && (event->modifiers() & Qt::ControlModifier))
 {
 sendMessage();
 return true;
 }
 }
 return false;
 }

然後把這個過濾器用installEventFilter函數安裝在聊天窗口的輸入框上(QTextEdit),這樣就實現快捷鍵的功能了。

三鍵組合Shift + Ctrl + A的實現

只要在窗體中相應keyPressEvent事件函數即可。

 void Window::keyPressEvent(QKeyEvent *e)
 {
 if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)
 {
 //pressed 
 }
 }

鍵盤按住Ctrl鍵 + 鼠標左鍵的實現

在窗體中相應mousePressEvent事件函數在其中檢測Ctrl鍵是否按住即可。

 void Window::mousePressEvent(QMouseEvent *e)
 {
 // 獲取鼠標在點擊窗體上的座標 
 QPoint pos = e->pos();
 if (e->button() == LeftButton)
 {
 if ( QApplication::keyboardModifiers () == Qt::ControlModifier)
 {
 //pressed 
 }
 }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章