今天使用Qt5.13时,发现其中一个bug:在Release模式下,对组件使用事件过滤器eventFilter会导致组件“消失”,这里的消失并不是真正的消失,而是使它变成透明,在界面中无显示。
以下是测试实例:
创建一个最简单是Qt工程:
mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
bool eventFilter(QObject* obj, QEvent* event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
其中主要是增加了一个事件过滤器:
protected: bool eventFilter(QObject* obj, QEvent* event);
mainwindow.cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//对组件安装事件过滤器
ui->label->installEventFilter(this);
ui->btn->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject* watched, QEvent* event) {
//过滤出CT_Img_Label对象
if (watched == ui->btn) {
//判断是否是双击事件
if (event->type() == QEvent::MouseButtonDblClick) {
//可以将QEvent转成QMouseEvent
// QMouseEvent *mouseE = static_cast<QMouseEvent*>(event);
qDebug() << "MouseButtonDblClick";
return true;
}
}else if (watched == ui->label) {
//判断是否是双击事件
if (event->type() == QEvent::MouseButtonDblClick) {
//可以将QEvent转成QMouseEvent
// QMouseEvent *mouseE = static_cast<QMouseEvent*>(event);
qDebug() << "MouseButtonDblClick";
return true;
}
} else {
//将其他事件交给父类
return QMainWindow::eventFilter(watched, event);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.ui文件:放置了一个label和一个button
在Debug模式下运行,一切正常,可以监听到对组件的双击事件:
但是切换成Release模式后:组件消失
事实上,这两个组件并非真正消失,而是变透明了,在label和btn的位置区域双击,仍能得到双击事件反馈
继续测试:对label安装事件过滤器,但是不监听。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//对组件安装事件过滤器
ui->label->installEventFilter(this);
ui->btn->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject* watched, QEvent* event) {
//过滤出CT_Img_Label对象
if (watched == ui->btn) {
//判断是否是双击事件
if (event->type() == QEvent::MouseButtonDblClick) {
//可以将QEvent转成QMouseEvent
// QMouseEvent *mouseE = static_cast<QMouseEvent*>(event);
qDebug() << "MouseButtonDblClick";
return true;
}
}
// else if (watched == ui->label) {
// //判断是否是双击事件
// if (event->type() == QEvent::MouseButtonDblClick) {
// //可以将QEvent转成QMouseEvent
// // QMouseEvent *mouseE = static_cast<QMouseEvent*>(event);
// qDebug() << "MouseButtonDblClick";
// return true;
// }
// }
else {
//将其他事件交给父类
return QMainWindow::eventFilter(watched, event);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
结果:
label出现,但button依旧是透明的
总结
此bug的触发条件:
Release模式 + 对组件安装事件过滤器 + 对事件进行监听 = 使组件变成透明
虽然发现了此bug,但仍不知道其原因,希望在之后的学习中能找到bug出现的原因。