Qt中的事件过滤器

Qt中的事件过滤器

  • 事件过滤器可以对需要的组件接收到的事件进行过滤,以及监控
  • 任意的QObject对象都可以作为事件过滤器使用
  • 事件过滤器的实现,需要重写eventFilter()函数
  • 组件要想被监控,则需要通过installEventFilter()安装事件过滤器
  • 事件过滤器能够决定是否将事件转发给组件对象,如下图所示:

 

eventFilter函数体如下所示:

bool QObject::eventFilter ( QObject * watched, QEvent * event );
       // watched:代表被监控的组件  event:代表要转发的事件
       //返回true,表示该事件也被过滤掉(处理),无需再转发了
       //返回false,则正常转发给watched

 

参考示例-实现文本框只允许输入数字:

复制代码

class MainWindow : public QMainWindow
 {
 public:
     MainWindow();

 protected:
     bool eventFilter(QObject *obj, QEvent *ev);

 private:
     QTextEdit *textEdit;
 };


 MainWindow::MainWindow()
 {
     textEdit = new QTextEdit;
     setCentralWidget(textEdit);
     textEdit->setAttribute(Qt::WA_InputMethodEnabled, false);     //禁止中文输入法
     textEdit->installEventFilter(this);
 }

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
      if (obj == textEdit)
     {
         if (event->type() == QEvent::KeyPress)
         {
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             switch(keyEvent->key())         //只接受0~9数字
             {
                case Qt::Key_0:
                case Qt::Key_1:
                case Qt::Key_2:
                case Qt::Key_3:
                case Qt::Key_4:
                case Qt::Key_5:
                case Qt::Key_6:
                case Qt::Key_7:
                case Qt::Key_8:
                case Qt::Key_9:
                    return false;
                default:
                    return true;
            }
         }
         else
         {
             return false;
         }
     }
     else
     {
       return QMainWindow::eventFilter(obj, event);
     }
 }

复制代码

posted @ 2019-08-09 11:02  昨夜昙花  阅读(33)  评论(0)    收藏  举报