当前位置: 代码迷 >> QT开发 >> Widget close不了 详见帖内描述,该怎么处理
  详细解决方案

Widget close不了 详见帖内描述,该怎么处理

热度:590   发布时间:2016-04-25 04:48:23.0
Widget close不了 详见帖内描述
我将我的情况简化为以下情况
我有一个 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);
}
你看下。
  相关解决方案