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_OBJECT

public:
    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键切换焦点。

总结:

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

本文完。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值