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<QKeyEvent*>(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
        }
    }
}