在做模仿qq登录界面的时候遇到了一个问题,就是如何让编辑框也拥有类似于按钮那样的点击之后完成某件事情的效果。
方法一:可以自定义信号。
方法二:可以使用事件过滤器来实现编辑框的点击事件。
方法三:使用编辑框自己的信号(实现效果不是很好,所以可以考虑方法一和方法二)。
本文介绍方法二,事件过滤器的使用。
实现效果:
鼠标点击编辑框,对应的图标变成蓝色,点击窗口的其他位置或者其他编辑框,对应的图标变回原样。
核心代码:
头文件:
重载eventFilter函数
bool eventFilter(QObject *obj, QEvent *e);
.cpp文件:
重写虚函数eventFilter
bool loginWIn::eventFilter(QObject *obj, QEvent *e) QMouseEvent *me=(QMouseEvent *)e;//类型转换 if(obj == this->edit1 && e->type() == QEvent::MouseButtonPress) if(me->button() == Qt::LeftButton)//鼠标左键 pix.load("image/ID_press.png");//加载图片 pix=pix.scaled(25, 25, Qt::KeepAspectRatio);//图标适应尺寸 this->lab2->setPixmap(pix);//账号旁边的label变成蓝色 //密码编辑框的内容为空的话,对应的label变为灰色 if(this->edit2->text().length() == 0) pix.load("image/pwd.png"); pix=pix.scaled(31, 31, Qt::KeepAspectRatio); this->lab3->setPixmap(pix); if(obj == this->edit2 && e->type() == QEvent::MouseButtonPress) if(me->button() == Qt::LeftButton)//鼠标左键 pix.load("image/pwd_press.png"); pix=pix.scaled(31, 31, Qt::KeepAspectRatio); this->lab3->setPixmap(pix); if(this->edit1->text().length() == 0) pix.load("image/ID.png"); pix=pix.scaled(25, 25, Qt::KeepAspectRatio); this->lab2->setPixmap(pix); if(obj != this->edit1 && obj != this->edit2 && e->type() == QEvent::MouseButtonPress) if(me->button() == Qt::LeftButton) this->setFocus();//将焦点设置成当前窗口,不然鼠标焦点还是停留在账号或密码编辑框 if(this->edit1->text().length() == 0) pix.load("image/ID.png"); pix=pix.scaled(25, 25, Qt::KeepAspectRatio); this->lab2->setPixmap(pix); if(this->edit2->text().length() == 0) pix.load("image/pwd.png"); pix=pix.scaled(31, 31, Qt::KeepAspectRatio); this->lab3->setPixmap(pix); return QWidget::eventFilter(obj, e);
使用事件过滤器:
可以将整个窗口加载事件过滤器。
qApp->installEventFilter(this);//整个窗口都加上事件过滤
或者单独的某个控件加载事件过滤器。
this->edit1->installEventFilter(this);
通过以上的代码就可以实现事件过滤器的简单使用,不止可以设置点击事件,也可以设置鼠标滑入事件QEvent::HoverEnter,或者鼠标滑出事件QEvent::HoverLeave等等。这就可以根据实际情况来自己实现对应的需求了。
|