首页 > 其他分享 >Qt之事件系统

Qt之事件系统

时间:2023-05-22 15:11:32浏览次数:35  
标签:Qt keyPressEvent 系统 MyLineEdit event 事件 include MainWindow

  Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。常见的处理事件的方法如下:

(1).重新实现部件的paintEvent、mousePressEvent()等事件处理函数,这是最常用的一种方法,不过只能用来出来特定部件的特定事件。

(2).重新实现event()函数,QObject类的event()函数可以在事件到达默认的事件处理函数之前获取该事件。

(3).在对象上安装事件过滤器,使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。

一、重写keyPressEvent函数

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>

class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MyLineEdit(QWidget *parent = nullptr);

protected:
    void keyPressEvent(QKeyEvent *event) override;

};

#endif // MYLINEEDIT_H
#include "my_lineedit.h"

#include <QKeyEvent>
#include <QDebug>

MyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent)
{

}

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "MyLineEdit键盘按下事件";
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets>

class MyLineEdit;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QMainWindow *parent = nullptr);
    ~MainWindow();

protected:
    void keyPressEvent(QKeyEvent *event) override;

private:
    MyLineEdit *m_pLineEdit;
};
#endif // MAINWINDOW_H
#include "main_window.h"
#include "my_lineedit.h"

#include <QKeyEvent>
#include <QDebug>

MainWindow::MainWindow(QMainWindow *parent)
    : QMainWindow(parent),m_pLineEdit(new MyLineEdit(this))
{
    this->setFixedSize(600, 400);
    m_pLineEdit->move(100, 100);
}

MainWindow::~MainWindow()
{
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "MainWindow键盘按下事件";
}

这里自定义了一个MyLineEdit类,它继承自QLineEdit类,然后在MainWindow界面中添加一个MyLineEdit部件,这里既实现了MyLineEdit类的键盘按下事件处理函数,也实现了MainWindow类的键盘按键事件的处理函数,随意按下键盘的按键,只会打印"MyLineEdit键盘按下事件",说明这时只执行了MyLineEdit类中的keyPressEvent()函数。

下面在MyLineEdit类中的keyPressEvent()函数最后添加如下一行代码,让其忽略掉这个事件

event->ignore(); //忽略该事件

这时如果在按下按键,则会打印"MyLineEdit键盘按下事件"和"MainWindow键盘按下事件",但是这时却输入框中却无法输入任何字符,为了可以在输入框中正常输入字符,还需要添加下面一行代码:

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "MyLineEdit键盘按下事件";

    QLineEdit::keyPressEvent(event); //执行QLineEdit类的默认事件处理
    event->ignore(); //忽略该事件
}

从上述例子可以看出,事件是先传递给指定窗口部件的,确切的说应该是先传递给获得焦点的窗口部件,但是如果该部件忽略掉该事件,那么这个事件就会传递给这个部件的父部件。重新实现事件处理函数时,一般要调用父类的相应事件处理函数来实现默认操作。

标签:Qt,keyPressEvent,系统,MyLineEdit,event,事件,include,MainWindow
From: https://www.cnblogs.com/QingYiShouJiuRen/p/17420675.html

相关文章

  • 工作日常:手术麻醉管理系统功能模块
    全围术期:◼    手术监控——麻醉科主任◼    麻醉路径——麻醉科主任◼    麻醉知识引擎——手术室所有医务人员术前:◼    麻醉医生排班——麻醉科主任◼    术前访视——麻醉医生术中:◼    术中记录——麻醉医生◼ ......
  • Linux Redis 做成系统服务
    概述系统:CentOS7.6Redis安装后启动方式:redis-server/xxx/xxx/redis.conf。若不指定配置文件,则redis-server不会读取任何配置文件,而是使用自身携带固定配置信息启动。若想将redis做成系统服务,则需在/etc/init.d目录下添加一个配置文件,文件中指定要启动的程序,如何可以使用系统服......
  • 通过 命令 DISM /Online /Get-Features 将显示在您的系统上安装的所有Windows功能列
    DISM/Online/Enable-Feature/FeatureName:<组件名称>/Allecho组件已成功启用!pause其中,<组件名称>是您要启用的组件的名称。可以在WindowsServer2022上使用以下命令列出可用组件:DISM/Online/Get-Features运行上面的命令后,将显示在您的系统上安装的所有Windows功能列表......
  • qt 操作添加快捷键
    1QShortcut*backwardShortcut=newQShortcut(QKeySequence::Copy,this);2connect(backwardShortcut,SIGNAL(activated()),this,SLOT(slot_action_screenshotTriggered()));这是给截图操作添加了ctrl+c快捷键放到剪贴板voidslot_action_screenshotTrigger......
  • Redhat7.3linux系统防火墙命令总结
    在Linux系统部署皕杰报表后,需要关闭防火墙或者开放报表工具使用的端口,才能通过浏览器访问报表。在linux中如何关闭防火墙或开启端口呢?基本上是基于命令操作。通过几天的实践,总结了有关防火墙的操作命令,现记录如下。systemctlstatusfirewalld:查看防火墙状态systemctlstartfirewa......
  • GitLib详细使用手册(windows系统)
    Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对gitlab的常见的使用有建立仓库、提交代码、更新代码、回滚代码、显示/修改日志、拉取分支、解决冲突、设置比较工具等一、安装git下载官网地址: https://git-scm.com/downloads根据操......
  • windows系统下SNMP协议获取系统内存、CPU实例代码
    系统环境:win10注:win10及以下windows平台,在控制面板,程序中,添加snmp服务功能。可参照:https://jingyan.baidu.com/article/3d69c5515e56b3f0cf02d7bf.html为方便测试snmp协议,先关闭系统防火墙,后续可根据需要进行防护墙配置。工具资源下载:https://download.csdn.net/download/csdnyang......
  • Linux-RHCA操作系统
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 一次系统高LOAD优化之经验
    现象某个应用,机器数增加到了150台,但是发现其load较高。对于4核机器来说,负载率高峰期超过4,意味着高峰期几乎满载,这是一个不正常的现象。经验法则如下:当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化;当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来;......
  • 【iOS开发】UIWebView调用JS点击事件(stringByEvaluatingJavaScriptFromString)
    一、场景描述产品需求是移动端app要调用h5页面,然后监听h5代码中的某个方法,最终执行h5中的具体代码。二、具体代码.m文件@interfaceViewController()<UIWebViewDelegate>@property(nonatomic,strong)UIWebView*webView;@end@implementationViewController-(void)viewDid......