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
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章