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. SpringBoot内嵌ftp服务

    引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.ftpserver/ftpserver-core --> <depen ...

  2. 【LeetCode】1208. 尽可能使字符串相等 Get Equal Substrings Within Budget (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 目录 题目描述 示例 解题思路 滑动窗口 代码 刷题心 ...

  3. 【LeetCode】114. Flatten Binary Tree to Linked List 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先序遍历 递归 日期 题目地址:https://le ...

  4. Collision(hdu5114)

    Collision Time Limit: 15000/15000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Tot ...

  5. Codeforces 450C:Jzzhu and Chocolate(贪心)

    C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...

  6. fork之后,子进程从父进程那继承了什么(转载)

    转载自:https://blog.csdn.net/xiaojun111111/article/details/51764389 知道子进程自父进程继承什么或未继承什么将有助于我们.下面这个名单会因为 ...

  7. RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成

    搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...

  8. Categorical Reparameterization with Gumbel-Softmax

    目录 概 主要内容 Gumbel distribution Jang E., Gu S. and Poole B. Categorical reparameterization with gumbel ...

  9. jsp标签 c:when

    Illegal use of <when>-style tag without <choose> as its direct parent 在jsp页面用报错Illegal u ...

  10. c++—通讯录管理系统

    一.运用所学的结构体.地址指针等基础知识,完成通讯录管理系统 二.系统主要有以下6个功能: 1.添加联系人2.显示联系人 3.删除联系人 4.查找联系人5.修改联系人 6.清空联系人 1 #inclu ...