前言:
有时会有这种需求想让 label 图标 具有点击功能, 但用 button 的话, 显示效果又不好。 那这里就介绍 一种 方法。 那就是 事件过滤器(eventfilter)
1: 事件过滤器
eventfilter 不只有有过滤事件的功能, 还有添加事件的功能
2: 使用
1> void installEventFilter(QObject *filterObj);
2> bool eventFilter(QObject *obj, QEvent *event);
3: 代码
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
// 安装事件过滤器
ui->pushButton->installEventFilter(this);
// 安装事件过滤器
ui->label->installEventFilter(this);
connect(ui->pushButton,&QPushButton::clicked,[this]{
qDebug()<<"pushbutton clicled";
});
}
Dialog::~Dialog()
{
delete ui;
}
// 事件过滤器
bool Dialog::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
if(obj == ui->pushButton)
{
qDebug()<<"event filter pushbutton";
return true;
}
else if(obj == ui->label)
{
qDebug()<<"install event label";
return true;
}
}
// return false;
//这种最好用原有的替代 true false, 因为有可能你重写的虚函数,阉割了之前控件自带的属性。
// 为了保持既有你修改的属性和原有的属性。 return QDialog::eventFilter(obj, event);
// 这样最最好的解决。
return QDialog::eventFilter(obj, event);
}
代码讲解
eventFilter 函数 必须要有返回值。 没有返回值的话 或者是true,对应安装事件过滤器的控件 是显示不出来的。 返回值基本上是
// return false;
return QDialog::eventFilter(obj, event);
这种最好用原有的替代 true false, 因为有可能你重写的虚函数,阉割了之前控件自带的属性。
为了保持既有你修改的属性和原有的属性。 return QDialog::eventFilter(obj, event);
这样最最好的解决
if(obj == ui->pushButton)
{
qDebug()<<"event filter pushbutton";
return true;
返回true 代表事件已被过滤。 点击button 并不会出发 上面的槽函数。 因为事件过滤器的优先级 高于槽函数。
返回 false 的话。 代表该事件没有被过滤。 上面的槽函数是可以被调用的
}