1.重写控件的focusInEvent()和focusOutEvent()函数

针对一个窗口上的多个可编辑控件(比如QLineEdit、QTextEdit等),我们希望控件在获得焦点之后能够和其他的控件有区别,如果想实现这一功能,就要用到focusInEvent()和focusOutEvent()函数。查看了官方文档,可以在子类中重写这两个函数来实现我们的目的。既然是要控件得到焦点改变动作,则应该重写控件的focusInEvent()和focusOutEvent()函数,这里以QLineEdit为例进行说明。重写QLineEdit类,重新定义这两个处理函数,然后在主程序中使用重写之后的类,记得要包含重写的QLineEdit头文件,具体代码如下:

// MYLINEEDIT_H
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
class MyLineEdit : public QLineEdit
        Q_OBJECT
 public:
       MyLineEdit(QWidget *parent=0);
       ~MyLineEdit();
 protected:
       virtual void focusInEvent(QFocusEvent *e);
       virtual void focusOutEvent(QFocusEvent *e);
#endif // MYLINEEDIT_H
//myLineEdit.cpp
#include "myLineEdit.h"
MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent)
MyLineEdit::~MyLineEdit()
void MyLineEdit::focusInEvent(QFocusEvent *e)
       QPalette p=QPalette();
       p.setColor(QPalette::Base,Qt::green);    //QPalette::Base 对可编辑输入框有效,还有其他类型,具体的查看文档
       setPalette(p);
void MyLineEdit::focusOutEvent(QFocusEvent *e)
       QPalette p1=QPalette();
       p1.setColor(QPalette::Base,Qt::white);
       setPalette(p1);
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "MyLineEdit.h"
#include <QGridLayout>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
               QWidget(parent),
               ui(new Ui::Widget)
       ui->setupUi(this);
       init();
Widget::~Widget()
       delete ui;
void Widget::init()
       lineEdit1=new MyLineEdit(this);
       lineEdit2=new MyLineEdit(this);
       gridLayout=new QGridLayout;
       gridLayout->addWidget(lineEdit1,0,0);
       gridLayout->addWidget(lineEdit2,1,0);
       setLayout(gridLayout);

运行上面的程序,当QLineEdit获得焦点后背景自动填充为绿色,失去焦点后背景恢复白色,这样就达到了我想要的焦点高亮背景提醒功能,但是实际分析想来还是很复杂的,假如我的程序还有QTextEdit、QSpinBox等等控件,那我还要全部都重写这些类,这样还是比较麻烦的。

2.事件过滤器(eventFilter)

Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。

实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
class Widget : public QWidget
     Q_OBJECT
 public:
     explicit Widget(QWidget *parent = 0);
     ~Widget();
 public slots:
     bool eventFilter(QObject *,QEvent *);    		// 注意这里
 private:
     Ui::Widget *ui;
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QPalette>
Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
     ui->setupUi(this); 
     ui->lineEdit1->installEventFilter(this);  		// 在窗体上为lineEdit1安装过滤器
     ui->lineEdit2->installEventFilter(this);  		// 在窗体上为lineEdit2安装过滤器
Widget::~Widget()
     delete ui;
bool Widget::eventFilter(QObject *watched, QEvent *event)
     if (watched==ui->lineEdit1)         		// 首先判断控件(这里指 lineEdit1)
          if (event->type()==QEvent::FocusIn)     	// 然后再判断控件的具体事件 (这里指获得焦点事件)
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::green);
              ui->lineEdit1->setPalette(p);
          else if (event->type()==QEvent::FocusOut)    // 这里指 lineEdit1 控件的失去焦点事件
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::white);
              ui->lineEdit1->setPalette(p);
     if (watched==ui->lineEdit2)           		// 这里来处理 lineEdit2 , 和处理lineEdit1 是一样的
          if (event->type()==QEvent::FocusIn)
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::green);
              ui->lineEdit2->setPalette(p);
         else if (event->type()==QEvent::FocusOut)
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::white);
              ui->lineEdit2->setPalette(p);
 return QWidget::eventFilter(watched,event);     	// 最后将事件交给上层对话框

3.动态按钮

描述:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态,这个上面的事件过滤是一个道理,就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEventButtonRelease)

bool EventFilter::eventFilter(QObject *watched,QEvent *event)
  if (watched==Label1)
      if (event->type()==QEvent::MouseButtonPress)
            QMouseEvent *mouseEvent=static_cast<QMouseEvent *>event;
            if (mouseEvent->buttons() && Qt::LeftButton)
            {  // 更换一张大一点的图片    ..........
      if (event->type()==QEvent::MouseButtonRelease)
      {    // 重新换回最初那张图片 ...........
  return QWidget::eventFilter(watched,event);
                    Qt获得和失去焦点事件(Focus事件)1.重写控件的focusInEvent()和focusOutEvent()函数针对一个窗口上的多个可编辑控件(比如QLineEdit、QTextEdit等),我们希望控件在获得焦点之后能够和其他的控件有区别,如果想实现这一功能,就要用到focusInEvent()和focusOutEvent()函数。查看了官方文档,可以在子类中重写这两个函数来实现我们的目的...
				
帮忙找程序问题,发现程序启动左右控制键以及退格键不好用,但是用鼠标点击界面任何地方之后又好使了!发现是焦点的问题,将焦点设置在启动的窗体就可以了,最简单的方法! 1、setFocus使Widge获得焦点 widget还有焦点事件,解决焦点切换之后不响应按键: 1、void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual prot
根据业务需求,在输入框(QlineEdit)下面做一个模糊查找的弹窗(PopupWidget),当鼠标点击弹窗以外的地方时,这个窗口关闭,当光标在输入框重新输入内容时,再次弹框。 在网上查找到的方法;设置窗口标志位: setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); 此方法可以达到弹出式窗口的效果,但是出现了一个致命的问题,但我再次show()这个窗口时(popupWidget),程序会闪退,网上找了很久才找到解决办法。
今天来为大家分享一个小功能,首先看实现的效果吧~功能讲解:QLineEdit控件进行文本编辑,点击保存按钮后,隐藏编辑框和保存按钮,仅展示编辑内容,当鼠标点击空白处时,同样隐藏编辑框、隐藏保存按钮,但不存储编辑文本如果你要需要实现这样的功能,就继续往下看吧~三个控件:QLineEdit编辑框、QPushButton按钮、QLabel纯文本展示。默认QLabel控件是隐藏状态,只有点击保存按钮以及失去焦点后才会展示。此时需要响应两个消息。消息1:点击保存按钮 connect(ui.btnSave, 
文章目录前言焦点事件QLineEdit焦点事件测试使用事件过滤器的方式重写QLineEdit的方式操作系统对于焦点事件的影响结论 在项目中,遇到了在通过焦点事件调用系统输入法显示异常的情况,后来发现问题发生在焦点事件上,在调用输入法以及关闭输入法的时候出现了焦点的转移,这就导致输入法一直被调用。 就特意研究了一下Qt焦点事件,以及通过QLineEdit进行一些测试操作。 焦点事件 在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。 焦点事件分为FocusIn和F
首先来说说为什么要设置焦点吧。 设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。 一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等) setFocusPolicy( Qt::FocusPolicypolicy) 设置获得焦点的方式 Constant Value Desc...
今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查焦点问题,以及tab键的焦点调转顺序。 首先要感谢这篇文章:【QT】新弹窗默认无焦点 给了我一个思路,我能不能在窗口show出来之后,或者show事件中知道当前的focus在哪个控件上? 如果你是界面是继承自QWidget的话: void ResetPasswordDialog::showEvent(QShowEv...
QT LineEdit和TextEdit 在信号里没有获得焦点失去焦点的信号,这使得在编程时想要在失去焦点时有相应的处理动作成为一个难点。解决办法就是自己继承相应的QT LineEdit和TextEdit 类添加信号,同时重写对应得两个函数: virtual void focusInEv...
如果您想让 Qt widget 失去焦点,可以调用 QWidget 类的 `clearFocus()` 方法。例如,如果您有一个名为`myWidget`的 QWidget 对象,您可以在代码中使用如下语句使其失去焦点: ```cpp myWidget->clearFocus(); 这将清除该 widget 的焦点,使其无法获得键盘输入焦点。注意,如果该 widget 正在编辑文本或其他用户输入,则这个操作可能会中断用户的操作,并导致他们的工作丢失。因此,在调用 `clearFocus()` 方法之前,您应该仔细考虑当前的上下文和用户体验。
A problem has been detected and windows has been shut down to prevent damage to your computer. 101439