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
- }
- }
- }
一個例子:
- #include "mainwindow.h"
- #include <QKeyEvent>
- #include <QMessageBox>
- #include <QDebug>
- #include <QShortcut>
- #include <QPushButton>
- #include <QHBoxLayout>
- #include <QAction>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent)
- {
- // 設置窗口布局
- QWidget *mainWidget = new QWidget(this);
- QPushButton *button1 = new QPushButton("MessageBoxA", this);
- QPushButton *button2 = new QPushButton("MessageBoxB", this);
- QHBoxLayout *layout = new QHBoxLayout(this);
- layout->addWidget(button1);
- layout->addWidget(button2);
- mainWidget->setLayout(layout);
- this->setCentralWidget(mainWidget);
- this->resize(200, 100);
- this->setWindowTitle("Test");
- // 創建QAction並設置快捷鍵
- QAction *actionA = new QAction(this);
- actionA->setShortcut(QKeySequence(tr("Ctrl+A")));
- // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));
- QAction *actionB = new QAction(this);
- actionB->setShortcut(QKeySequence(tr("Ctrl+B")));
- // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B));
- // 給button添加快捷鍵
- // this->addAction(actionA);// 沒用
- button1->addAction(actionA);// 必須將快捷鍵添加到按鈕上,同時使keyPressEvent失效,無法捕捉到Ctrl+A
- button2->addAction(actionB);
- // 設置快捷鍵相應
- connect(actionA, &QAction::triggered, this, &MainWindow::button1_click);
- connect(actionB, &QAction::triggered, this, &MainWindow::button2_click);
- // 設置按鈕點擊事件相應
- connect(button1, &QPushButton::clicked, this, &MainWindow::button1_click);
- connect(button2, &QPushButton::clicked, this, &MainWindow::button2_click);
- // 占用快捷鍵,使keyPressEvent函數失效
- QShortcut *shortCut1 = new QShortcut(QKeySequence(tr("Delete")), this);
- QShortcut *shortCut2 = new QShortcut(QKeySequence(tr("Return")), this);
- // QShortcut *shortCut2 = new QShortcut(tr("Return"), this);
- }
- MainWindow::~MainWindow()
- {
- }
- // 如果快捷鍵被設置,keyPressevent就無法處理相應的按鈕事件
- void MainWindow::keyPressEvent(QKeyEvent *event)
- {
- switch (event->key())
- {
- case Qt::Key_0:
- {
- qDebug() << Qt::Key_0;
- QMessageBox::about(NULL, "0", "0");
- break;
- }
- case Qt::Key_Return:// 被占用,失效
- {
- qDebug() << Qt::Key_Return;
- QMessageBox::about(NULL, "return", "return");
- break;
- }
- case Qt::Key_Delete:// 被占用,失效
- {
- qDebug() << Qt::Key_Delete;
- QMessageBox::about(NULL, "Delete", "Delete");
- break;
- }
- case QKeySequence::Delete:// 捕獲不到,不能有這種方式處理
- {
- qDebug() << QKeySequence::Delete;
- QMessageBox::about(NULL, "QKeySequence::Delete", "QKeySequence::Delete");
- break;
- }
- case Qt::Key_F1:
- {
- qDebug() << Qt::Key_F1;
- QMessageBox::about(NULL, "F1", "F1");
- break;
- }
- case Qt::Key_O:// 處理組合快捷按鈕
- {
- if (event->modifiers() & Qt::ControlModifier)
- {
- QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
- }
- break;
- }
- case Qt::Key_A:// 被窗口button占用,失效,不能處理
- {
- if (event->modifiers() & Qt::ControlModifier)
- {
- QMessageBox::about(NULL, "Ctr+A", "Ctr+A");
- }
- break;
- }
- default:
- {
- qDebug() << event->key();
- }
- }
- // if (event->key() == Qt::Key_O)
- // {
- // if (event->modifiers() & Qt::ControlModifier)
- // {
- // QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
- // }
- // }
- }
- void MainWindow::keyReleaseEvent(QKeyEvent *event)
- {
- }
- void MainWindow::button1_click()
- {
- QMessageBox::about(NULL, "MessageBoxA", "MessageBoxA");
- }
- void MainWindow::button2_click()
- {
- QMessageBox::about(NULL, "MessageBoxB", "MessageBoxB");
- }
http://blog.csdn.net/caoshangpa/article/details/77933937
原文鏈接:http://blog.csdn.net/yang382197207/article/details/45363967
原文鏈接:http://blog.csdn.net/xj626852095/article/details/12039093