zoukankan      html  css  js  c++  java
  • 再谈Qt Focus事件

    [2010年07月30日文档]

    在我的前一篇文章<focusInEvent()与focusOutEvent>中,我实现了QLineEdit获得焦点高亮显示与失去焦点恢复原样的操作,是通过重新继承该类,再重构该事件函数的方式。这篇文章紧跟那篇文章,这里要实现的功能也是一样的,而是通过另外不同的方式——事件过滤器(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);     // 最后将事件交给上层对话框
    }

    另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)

    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);
    }
  • 相关阅读:
    Fragment传参
    android手机旋转方向识别
    如何激活已经运行过的Activity, 而不是重新启动新的Activity
    Android 在Canvas中实现画笔效果(一)--钢笔
    [AS3]as3画笔实例实现橡皮擦功能源代码
    在 Windows 環境下利用 VNC 遠端控管 Mac OS X Server
    mac下开发IOS代码管理
    Android开发--仿微信语音对讲录音
    Android 二维码 生成和识别(附Demo源码)
    Android开源项目分类汇总
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/2526776.html
Copyright © 2011-2022 走看看