当前位置: 首页 > news >正文

Qt处理焦点事件(获得焦点,失去焦点)

背景:

我只是想处理焦点动作,由于懒,上网一搜,排名靠前的一位朋友,使用重写部件的方式实现。还是因为懒,所以感觉复杂了。于是又花了一分钟解决了一下。

所以记录下来,以免以后忘了。

思路:

事件过滤器是个好东西。

在vs里,从6.0到.net,为什么很多人评价说人家编程优雅,确实好用。代码自动格式化,各种事件特别全。

在qt里面转到槽,就简单的几个信号。大部分还是要靠事件过滤器细分。其实,qt内部已经准备了很多最基础的信号(事件),只是需要多这样一步。

插曲:之前跟同事聊,有些事实现起来不愿意多想,闲聊一句:qt能干这事不?也是随口一句回答:c++都不行还什么能行?这句随口一答,当时是我即兴发挥,没考虑负不负责任。但却成了后来qt之旅的信心来源。

言归正传。

先说一种场景,比如窗体上放一个文本框,我希望它永远是焦点,也就是说,只要焦点离开,就setfocus。不讨论实用性,只讨论方法。以前在js中就实现过。

所以,第一步要做的是先看QEvent帮助,确认里面支持。于是看到:enum QEvent::Type中有
QEvent::FocusIn和QEvent::FocusOut,这就行了。我们只用到QEvent::FocusOut。
 

方法:

给文本框安装事件过滤器,窗体代码中重写eventFilter函数,并在其中判断event->type()。代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;bool eventFilter(QObject *watched, QEvent *event);
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->lineEdit->installEventFilter(this);
}MainWindow::~MainWindow()
{delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if (watched == ui->lineEdit && event->type() == QEvent::FocusOut){ui->lineEdit->setFocus();return true;}return QWidget::eventFilter(watched, event);
}

然后直接运行看效果,始终是这个文本框获得焦点,无论鼠标点击别处,或者tab键切换焦点。

总结:

所以,核心思想还是充分理解事件过滤器,相当好用。

本文完。

http://www.lryc.cn/news/257939.html

相关文章:

  • SiteGround如何设置WordPress网站自动更新
  • http代理和SOCK5代理谁更安全?
  • Kotlin关键字二——constructor和init
  • java的long类型超过9位报错:the literal 987654321000 of type int is out of range
  • 【Java期末复习资料】(4)模拟卷
  • 【计算机网络】UDP报文详解
  • 排序算法——归并排序
  • 2023 年安徽省职业院校技能大赛高职组“软件测试”赛项样题
  • Mysql8和Oracle实际项目中递归查询树形结构
  • docker mysql8 设置不区分大小写
  • Audio Siganl (MATLAB) 代码学习—常见问题3
  • 【PTA题目】7-8 矩阵运算 分数 10
  • Ubuntu20.04创建并挂在zfs池
  • x的平方根算法(leetcode第69题)
  • 打破空间限制,畅享真实生活
  • Python基础期末复习 新手 2
  • Java接入ChatGPT接口简单示例
  • 解决夜神模拟器与Android studio自动断开的问题
  • 利用C语言模拟实现堆的基本操作和调堆算法
  • react hooks之useRef和useImperativeHandle
  • scala方法与函数
  • 前端框架(Front-end Framework)和库(Library)的区别
  • mysql原理--B+树索引的使用
  • Android : Room 数据库的基本用法 —简单应用_三_版本
  • 微服务网关组件Gateway实战
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】三维重建(补充篇)
  • 关于uniapp X 的最新消息
  • spark从表中采样(随机选取)一定数量的行
  • java定位系统源码,UWB技术的无线定位系统源码
  • 阿里云sls日志服务如何查某个具体字段的平均数