序章
以下链接是拖放事件介绍和使用示例:
【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_OBJECT
public:
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个像素
- 当只有一个按键时,控件恢复到默认坐标
效果
因为自动重复返回了,所以效果会不是那么好。
键盘事件
结论
为什么一看书,就困呢?因为书,是梦开始的地方
。