分享

Qt学习之事件过滤器的使用(实现QLineEdit点击效果)

 myallmy 2022-04-28

        在做模仿qq登录界面的时候遇到了一个问题,就是如何让编辑框也拥有类似于按钮那样的点击之后完成某件事情的效果。

        方法一:可以自定义信号。

        方法二:可以使用事件过滤器来实现编辑框的点击事件。

        方法三:使用编辑框自己的信号(实现效果不是很好,所以可以考虑方法一和方法二)。

本文介绍方法二,事件过滤器的使用。

实现效果:

鼠标点击编辑框,对应的图标变成蓝色,点击窗口的其他位置或者其他编辑框,对应的图标变回原样。

 

核心代码:

头文件:

重载eventFilter函数

  1. protected:
  2. bool eventFilter(QObject *obj, QEvent *e);

.cpp文件:

重写虚函数eventFilter

  1. //事件过滤器
  2. bool loginWIn::eventFilter(QObject *obj, QEvent *e)
  3. {
  4. QPixmap pix;//用于保存背景图片
  5. QMouseEvent *me=(QMouseEvent *)e;//类型转换
  6. //账号输入框被点击
  7. if(obj == this->edit1 && e->type() == QEvent::MouseButtonPress)
  8. {
  9. if(me->button() == Qt::LeftButton)//鼠标左键
  10. {
  11. //以下代码为点击编辑框后实现所需要的效果
  12. pix.load("image/ID_press.png");//加载图片
  13. pix=pix.scaled(25, 25, Qt::KeepAspectRatio);//图标适应尺寸
  14. this->lab2->setPixmap(pix);//账号旁边的label变成蓝色
  15. //密码编辑框的内容为空的话,对应的label变为灰色
  16. if(this->edit2->text().length() == 0)
  17. {
  18. pix.load("image/pwd.png");
  19. pix=pix.scaled(31, 31, Qt::KeepAspectRatio);
  20. this->lab3->setPixmap(pix);
  21. }
  22. }
  23. }
  24. //密码输入框被点击
  25. if(obj == this->edit2 && e->type() == QEvent::MouseButtonPress)
  26. {
  27. if(me->button() == Qt::LeftButton)//鼠标左键
  28. {
  29. pix.load("image/pwd_press.png");
  30. pix=pix.scaled(31, 31, Qt::KeepAspectRatio);
  31. this->lab3->setPixmap(pix);
  32. if(this->edit1->text().length() == 0)
  33. {
  34. pix.load("image/ID.png");
  35. pix=pix.scaled(25, 25, Qt::KeepAspectRatio);
  36. this->lab2->setPixmap(pix);
  37. }
  38. }
  39. }
  40. //账号密码输入框以外的被点击
  41. if(obj != this->edit1 && obj != this->edit2 && e->type() == QEvent::MouseButtonPress)
  42. {
  43. if(me->button() == Qt::LeftButton)
  44. {
  45. this->setFocus();//将焦点设置成当前窗口,不然鼠标焦点还是停留在账号或密码编辑框
  46. //编辑框的内容为空的话,对应的图标变为灰色
  47. if(this->edit1->text().length() == 0)
  48. {
  49. pix.load("image/ID.png");
  50. pix=pix.scaled(25, 25, Qt::KeepAspectRatio);
  51. this->lab2->setPixmap(pix);
  52. }
  53. if(this->edit2->text().length() == 0)
  54. {
  55. pix.load("image/pwd.png");
  56. pix=pix.scaled(31, 31, Qt::KeepAspectRatio);
  57. this->lab3->setPixmap(pix);
  58. }
  59. }
  60. }
  61. return QWidget::eventFilter(obj, e);
  62. }

使用事件过滤器:

        可以将整个窗口加载事件过滤器。

qApp->installEventFilter(this);//整个窗口都加上事件过滤

        或者单独的某个控件加载事件过滤器。

this->edit1->installEventFilter(this);

        通过以上的代码就可以实现事件过滤器的简单使用,不止可以设置点击事件,也可以设置鼠标滑入事件QEvent::HoverEnter,或者鼠标滑出事件QEvent::HoverLeave等等。这就可以根据实际情况来自己实现对应的需求了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多