我将我的情况简化为以下情况
我有一个 MainWidget
在MainWidget 构造时 new widget1, new widget2 有个n个 (widget 和 MainWidget 不存在父子关系)
我通过一个Qlist 来管理这些 widget。 并且这些widget都安装了 事件过滤器 widget->installEventFilter(MainWidget)。
关闭MainWindow时 会调用
void MainWindow::closeEvent( QCloseEvent *event )
{
这里循环取出所有 widget 进行widget->close()
并进行delete widget
最后 event->accept()
}
问题出现了 widget 都关闭了 MainWindow 关闭不了, 之后再次点击close按钮 不会调用closeEvent
下面是eventFilter的大概流程
bool MainWindow::eventFilter( QObject *object, QEvent *event )
{
if (event->type() == QEvent::Close)
{
delete对应widget, 删除list中的widget
}
return QWidget::eventFilter(object, event);
}
不知道问题出现在什么地方? 谢谢大家支持。
------解决方案--------------------
我改了一下代码就可以了。。不要调用close,而直接delete 就可以了。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i = 0; i < 10; i++)
{
QWidget *w = new QWidget;
w->show();
m_listWidget.append(w);
w->installEventFilter(this);
}
// unsigned char data[17];
// memset(data, 0, sizeof(data));
// QString str = "123";
// for(int i = 0; i < str.length(); i++)
// {
// if(i >= sizeof(data))
// {
// break;
// }
// data[i] = str.at(i).toAscii();
// qDebug() << data[i];
// }
// qDebug() << data;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *e)
{
qDebug() << m_listWidget.count();
for(int i = 0; i < m_listWidget.count(); i++)
{
QWidget *w = m_listWidget.at(i);
delete w;
w = NULL;
}
e->accept();
}
bool MainWindow::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::Close)
{
for(int i = 0; i < m_listWidget.count(); i++)
{
QWidget *w = m_listWidget.at(i);
if(o == w)
{
delete w;
w = NULL;
m_listWidget.removeAt(i);
return true;
}
}
return false;
}
return QMainWindow::eventFilter(o, e);
}
你看下。