通过代码调试就明白所有
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QCloseEvent>
#include <QTimer>
class Send : public QObject
{
Q_OBJECT
public:
Send(QObject *parent = nullptr);
~Send();
public slots:
void SendSlot(void) const;
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = Q_NULLPTR);
~Widget();
signals:
void WidgetSignal(void);
private:
Send send;
QTimer timer;
void closeEvent(QCloseEvent *event);
void paintEvent(QPaintEvent *event);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
qDebug() << "4";
timer.start(500);
connect(&timer, SIGNAL(timeout()), &send, SLOT(SendSlot()));
}
Widget::~Widget()
{
qDebug() << "2";
}
void Widget::closeEvent(QCloseEvent *event)
{
(void)event;
qDebug() << "1";
/*可以不加,好像是因为如果这个被彻底关掉之前会断开与这个的所有联系*/
//disconnect(&timer, SIGNAL(timeout()), &send, SLOT(SendSlot()));
(new Widget)->show();
//方式三:
this->deleteLater();
}
void Widget::paintEvent(QPaintEvent *event)
{
(void)event;
qDebug() << "3";
//结合方式三来使用
this->close();
}
Send::Send(QObject *parent)
: QObject(parent)
{
}
Send::~Send()
{
}
void Send::SendSlot() const
{
qDebug() << "enter";
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget *w = new Widget;
w->show();
//方式一:
// w->close();//先关窗口
// w->deleteLater();//彻底删除窗口
//方式二:
// delete w;
return a.exec();
}