什么是焦点事件?

本文详细介绍了网页中文本框的焦点事件,包括如何通过鼠标点击或Tab键切换来触发onFocus、onBlur等事件,以及如何利用这些事件实现文本框提示信息的显示与隐藏。
焦点事件:
比如打开一个应用程序,里面有一个文本框,当你用鼠标点击这个文本框的时候,这个文本框就是获得了焦点,你会发现文本框里会有光标闪动,这是你可以对文本框进行操作,输入字符串什么的, 
也就是触发了keypress事件,当然并不一定是用鼠标点击文本框,使用tab键可以将焦点转移。 


文本焦点事件:
onBlur:当失去输入焦点后产生该事件
onFocus:当输入获得焦点后,产生该文件
Onchange:当文字值改变时,产生该事件
Onselect:当文字加亮后,产生该文件


例:
<input type="text" value="输入内容" onfocus="if(value=='输入内容') {value=''}" onblur="if (value=='') {value='输入内容'}"> //点击时文字消失,失去焦点时文字再出现
 
<input type="text" name="key" size="12" value="关键字" onFocus=this.select() onMouseOver=this.focus()> //鼠标移动到文本上方时,获取焦点并使文本值处选中状态
在 Qt 中,监听 `QLineEdit` 的焦点变化事件可以通过以下几种方式实现: --- ### ✅ 方法一:使用 `focusInEvent()` 和 `focusOutEvent()` 你可以继承 `QLineEdit` 并重写 `focusInEvent()` 和 `focusOutEvent()` 来捕获焦点获得和失去的事件。 #### 示例代码如下: ```cpp #include <QApplication> #include <QLineEdit> #include <QDebug> class FocusLineEdit : public QLineEdit { Q_OBJECT public: explicit FocusLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {} protected: void focusInEvent(QFocusEvent *event) override { QLineEdit::focusInEvent(event); qDebug() << "QLineEdit 获得焦点"; } void focusOutEvent(QFocusEvent *event) override { QLineEdit::focusOutEvent(event); qDebug() << "QLineEdit 失去焦点"; } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); FocusLineEdit lineEdit; lineEdit.setPlaceholderText("点击我试试"); lineEdit.show(); return app.exec(); } #include "main.moc" ``` --- ### ✅ 方法二:使用事件过滤器 `eventFilter()` 如果你不想继承 `QLineEdit`,可以使用事件过滤器来监听焦点事件。 #### 示例代码如下: ```cpp #include <QApplication> #include <QLineEdit> #include <QDebug> #include <QObject> class FocusWatcher : public QObject { Q_OBJECT public: bool eventFilter(QObject *obj, QEvent *event) override { if (event->type() == QEvent::FocusIn) { qDebug() << "QLineEdit 获得焦点(通过事件过滤器)"; } else if (event->type() == QEvent::FocusOut) { qDebug() << "QLineEdit 失去焦点(通过事件过滤器)"; } return QObject::eventFilter(obj, event); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QLineEdit lineEdit; FocusWatcher *watcher = new FocusWatcher(&lineEdit); lineEdit.installEventFilter(watcher); lineEdit.setPlaceholderText("点击我试试"); lineEdit.show(); return app.exec(); } #include "main.moc" ``` --- ### ✅ 方法三:使用信号槽机制(适用于更高级封装) 你也可以结合 `QWidget::focusInEvent()` 和 `QWidget::focusOutEvent()` 自定义发出信号的方式。 --- ### 总结: | 方法 | 描述 | 适用场景 | |------|------|----------| | **重写 `focusInEvent` / `focusOutEvent`** | 直接继承并重写事件处理函数 | 需要自定义控件行为时 | | **使用 `eventFilter`** | 不修改原类的情况下监听事件 | 动态监听多个控件 | | **自定义信号/槽机制** | 更加灵活、模块化 | 构建大型界面系统 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值