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