序章
以下链接是拖放事件介绍和使用示例:
【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484
【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006
以下链接是事件系统及键盘事件描述及示例:
【Qt开发流程】之事件系统1:事件系统描述及事件发生流程链接: https://blog.csdn.net/MrHHHHHH/article/details/134722922
【Qt开发流程】之事件系统2:鼠标事件及滚轮事件链接: https://blog.csdn.net/MrHHHHHH/article/details/134756089
键盘事件
QKeyEvent
类描述一个键盘事件。
当键盘有键按下或者释放时,键盘事件便会被发送给拥有输入焦点的部件。
关键事件包含一个特殊的接受标志,指示接收方是否将处理该关键事件。这个标志默认情况下是为QEvent::KeyPress和QEvent::KeyRelease
设置的,所以在处理键事件时不需要调用accept()
。对于QEvent::ShortcutOverride,接收者需要显式地接受事件来触发覆盖。在键事件上调用ignore()将把它传播到父小部件。事件沿着父小部件链向上传播,直到小部件接受它或事件过滤器使用它。
QWidget::setEnabled()
函数可用于启用或禁用小部件的鼠标和键盘事件。
事件处理程序QWidget::keyPressEvent()
、QWidget::keyReleaseEvent()
、QGraphicsItem::keyPressEvent()
和QGraphicsItem::keyReleaseEvent()
接收关键事件。
QKeyEvent
的key()
函数可以获得具体的按键,按键类型在Qt::Key
枚举中。
如:
需注意:
如Ctrl
和Shift
键,需要使用modifiers()
函数获取。
示例
以下是一个使用键盘事件的示例。
实现组合键控制控件移动。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void keyPressEvent(QKeyEvent *event);void keyReleaseEvent(QKeyEvent *event);
private:Ui::MainWindow *ui;bool bIsUp = false;bool bIsRight = false;bool bMove = false;
};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QKeyEvent>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setFocus();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::keyPressEvent(QKeyEvent *event)
{if(event->modifiers() == Qt::ControlModifier){if(event->key() == Qt::Key_M)setWindowState(Qt::WindowMaximized);if(event->key() == Qt::Key_N){setWindowState(Qt::WindowNoState);}}else if(event->type() == QEvent::KeyPress){switch (event->key()) {case Qt::Key_Up:{if(event->isAutoRepeat())return;bIsUp = true;}break;case Qt::Key_Right:{if(event->isAutoRepeat())return;bIsRight = true;}break;default:break;}}QMainWindow::keyPressEvent(event);}void MainWindow::keyReleaseEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key_Up:{if(event->isAutoRepeat())return;bIsUp = false;if(bMove){bMove = false;return;}if(bIsRight){ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);bMove = true;}else {ui->pushButton->move(80, 60);}}break;case Qt::Key_Right:{if(event->isAutoRepeat())return;bIsRight = false;if(bMove){bMove = false;return;}if(bIsUp){ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);bMove = true;}else {ui->pushButton->move(80, 60);}}break;default:{}break;}QMainWindow::keyReleaseEvent(event);
}
以上代码解释:
- keyPressEvent()重载,处理键盘按下事件,当重复按下时,返回,记录按下状态
- keyReleaseEvent()重载,处理键盘释放事件,当按下向上的同时,按下向右键,控件会在x , y 的基础上右下偏移10个像素
- 当只有一个按键时,控件恢复到默认坐标
效果
因为自动重复返回了,所以效果会不是那么好。
键盘事件
结论
为什么一看书,就困呢?因为书,是梦开始的地方
。