Widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QKeyEvent>
#include "mypushbutton.h"
class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = 0);
~Widget();
void keyPressEvent(QKeyEvent* e);
void keyReleaseEvent(QKeyEvent* e);
private:
MyPushButton *p1;
MyPushButton *p2;
}; #endif // WIDGET_H

mypushbutton.h:

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H #include <QPushButton>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(const QString& text,QWidget *parent = nullptr);
void keyPressEvent(QKeyEvent* e);
void keyReleaseEvent(QKeyEvent* e);
signals: public slots:
}; #endif // MYPUSHBUTTON_H

mypushbutton.cpp:

#include "mypushbutton.h"
#include<QKeyEvent>
#include<QDebug>
MyPushButton::MyPushButton(const QString& text,QWidget *parent)
:QPushButton(text,parent){}
void MyPushButton::keyPressEvent(QKeyEvent* e)
{
//e->modifiers() 修饰键
if(e->modifiers()&Qt::ControlModifier)
{
qDebug()<<"子类的Ctrl被按下了"<<endl;
}
if(e->modifiers()&Qt::AltModifier)
{
qDebug()<<"子类的Alt被按下了"<<endl;
}
switch(e->key())
{
case Qt::Key_A:
qDebug()<<__FUNCTION__<<e->text()<<endl;
break;
case Qt::Key_D:
qDebug()<<__FUNCTION__<<e->text()<<endl;
break;
}
}
void MyPushButton::keyReleaseEvent(QKeyEvent* e)
{ }

widget.cpp:

#include "widget.h"
#include<QDebug>
#include "mypushbutton.h"
#include<QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
p1=new MyPushButton("按钮1",this);
p2=new MyPushButton("按钮2",this);
QVBoxLayout *s=new QVBoxLayout(this);
s->addWidget(p1);
s->addWidget(p2);
//this->setFocus(); //本来是子窗口接受键盘事件,现在设置焦点窗口为父窗口
this->setFocus(Qt::OtherFocusReason); //按tab键可以实现在两个按钮之间来回切换
} void Widget::keyPressEvent(QKeyEvent* e)
{ //e->modifiers() 修饰键
if(e->modifiers()&Qt::ControlModifier)
{
qDebug()<<"Ctrl被按下了"<<endl;
}
if(e->modifiers()&Qt::AltModifier)
{
qDebug()<<"Alt被按下了"<<endl;
}
switch(e->key())
{
case Qt::Key_A:
qDebug()<<e->text()<<endl;
break;
case Qt::Key_D:
qDebug()<<e->text()<<endl;
break; }
}
void Widget::keyReleaseEvent(QKeyEvent* e)
{ } Widget::~Widget()
{ }

main.cpp:

#include "widget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show(); return a.exec();
}

效果:

QT之键盘事件的更多相关文章

  1. Qt之键盘事件监听-实时响应大小写Capslock按键

    目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...

  2. 【转】Qt鼠标键盘事件

    http://blog.csdn.net/lovebird_27/article/details/50351336 Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调 ...

  3. Qt中的键盘事件,以及焦点的设置(比较详细)

    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...

  4. QT 11 鼠标键盘事件添加

    鼠标事件 void mousePressEvent(QMouseEvent *event); //单击 void mouseReleaseEvent(QMouseEvent *event); //释放 ...

  5. 初识Qt鼠标、键盘事件及定时器和随机数

    1.新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget. 2.widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数 privat ...

  6. Qt事件系统之三:键盘事件

    QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...

  7. QT无窗口状态下对键盘事件的监听

    Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplica ...

  8. QWidget 键盘事件 焦点(QApplication源码)

    在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件. 键盘事件派发给谁? 如 ...

  9. Qt中的事件

    1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...

随机推荐

  1. byte数组(byte[])与MultipartFile相互转化

    MultipartFile转化为byte数组 byte[] bytes= file.getBytes(); byte数组转化为MultipartFile <dependency> < ...

  2. soui(1)之一个半透明的窗口

    一个样式 xml源码 <SOUI name="mainWindow" title="@string/title" bigIcon="ICON_L ...

  3. cmake之指定clang(++)编译器为默认编译器

    1.说明 本文演示环境的cmake版本3.18 clang是自己源码安装的,非获取已经编译好的binary 2.代码 2.1 添加下面的代码到CMakeLists.txt中,且放到 project语句 ...

  4. 【LeetCode】829. Consecutive Numbers Sum 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学方法 日期 题目地址:https://leetc ...

  5. MySQL中写操作

    具体到操作流程: 当执行某个写操作的 SQL 时,引擎将这行数据更新到内存的同时把对应的操作记录到 redo log 里面,然后处于 prepare 状态.并把完成信息告知给执行器. 执行器生成对应操 ...

  6. Denoising Diffusion Probabilistic Models (DDPM)

    目录 概 主要内容 Diffusion models reverse process forward process 变分界 损失求解 最后的算法 细节 代码 Ho J., Jain A. and A ...

  7. Java程序设计基础笔记 • 【第9章 方法与参数类型】

    全部章节   >>>> 本章目录 9.1 有参数有返回值的方法 9.1.1 有参数有返回值的方法的定义和调用 9.1.2 返回值的传递过程 9.1.3 方法返回值的注意事项 9 ...

  8. 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变

    查看本章节 查看作业目录 需求说明: 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变 当用户单击"+" ...

  9. 编写Java程序,使用JTable表格组件展现人员信息列表

    返回本章节 返回作业目录 需求说明: 使用JTable组件显现人员信息列表 实现思路: 创建一个JTable对象. 创建一个JScrollPane对象(显示横向和纵向滚动条). 将表格添加到滚动面板. ...

  10. Xstart远程连接Linux图形用户界面

    目标: 在自己的Windows桌面打开Linux的firefox浏览器 工具: Windows: Xmanager的Xstart工具 Linux: xterm,firefox 说明: 使用Xstart ...