1. 程式人生 > >Qt獲取組合鍵(鍵盤按住某鍵,滑鼠組合實現)

Qt獲取組合鍵(鍵盤按住某鍵,滑鼠組合實現)

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