Solved The destructor is not executed
-
So how did you create your MainWindow object?
-
//main.cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); uid_t uid = getuid(); QString shared_name = QString("unispy_config_tools_%1").arg(uid); QSharedMemory shared(shared_name); if (shared.attach()) { return 0; } shared.create(1); MainWindow w; w.show(); int ret = a.exec(); return ret; } //mainwindow.h class MainWindow : public CustomizeMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: void saveConfig(const QString &name, const QMap<QString, QString> &allChangedConfig); void Init(); void InitStackWidget(); void SetUpCustomizeUI(); void SetUpLogo(); void SetUpStackWidgetOptionButtonSlot(); void SetUpCloseButton(); void SetUpMinmizeWindowButton(); void SetUpOptionButton(); void ChangeVisibleWidget(int index); void RegisterSlots(); void OnBtnStateChanged(); void SetUpApplyButton(); void SetStyleSheet(); private: Ui::MainWindow *ui; } //mainwindow.cpp MainWindow::MainWindow(QWidget *parent) : CustomizeMainWindow(parent) ,ui(new Ui::MainWindow) { Init(); } MainWindow::~MainWindow() { } void MainWindow::Init() { ui->setupUi(this); SetUpCustomizeUI(); InitStackWidget(); RegisterSlots(); } //mainwindow 's super class //customize_mainwindow.h #ifndef CUSTOMIZEMAINWINDOW_H #define CUSTOMIZEMAINWINDOW_H #include <QMouseEvent> #include <QMainWindow> class CustomizeMainWindow : public QMainWindow { Q_OBJECT public: explicit CustomizeMainWindow(QWidget *parent = 0); ~CustomizeMainWindow(); private: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); private: QPoint m_last_mouse_position; bool m_move_widget_flag; }; #endif // CUSTOMIZEMAINWINDOW_H //customize_mainwindow.cpp #include "customize_mainwindow.h" #include <QStyleOption> #include <QPainter> #include <QBrush> #include <QApplication> CustomizeMainWindow::CustomizeMainWindow(QWidget* parent): QMainWindow(parent) ,m_move_widget_flag(false) { QString styleSheet = "QMainWindow {border: 1px solid rgb(128,128,128);}"; this->setStyleSheet(styleSheet); this->setWindowFlags(Qt::FramelessWindowHint); } CustomizeMainWindow::~CustomizeMainWindow() { } void CustomizeMainWindow::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void CustomizeMainWindow::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { m_last_mouse_position = event->globalPos(); m_move_widget_flag = true; } } void CustomizeMainWindow::mouseReleaseEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { m_move_widget_flag = false; } } void CustomizeMainWindow::mouseMoveEvent(QMouseEvent *event) { if (!event->buttons().testFlag(Qt::LeftButton)) return; if(!m_move_widget_flag) return; const QPoint position = pos() + event->globalPos() - m_last_mouse_position; //the position of mainfrmae + (current_mouse_position - last_mouse_position) move(position.x(), position.y()); m_last_mouse_position = event->globalPos(); } //void CustomizeMainWindow::on_button_minimize_cliked() //{ // setWindowState(windowState() | Qt::WindowMinimized); // QApplication::processEvents(); // setWindowState(windowState() & ~Qt::WindowMinimized); //}
There was a slot to close my mainwindow defined in the super class.
The slot;s content is this->close();
but, the mainwindow class never called it.
My mainwindow contains a StackedWidget and some some widgets class int it.
also, they extend a super class like customize_mainwindow that has a close slot,
but never be called. I removed them all. -
According to your code the dtor of MainWindow is executed directly after 'return ret;'
-
@Christian-Ehrlicher said in The destructor is not executed:
dto
I make a breaking pointer on the destructor.
but it didn't blocked at the breaking point. why? -
@chris_rookie said in The destructor is not executed:
but it didn't blocked at the breaking point. why?
Put a qDebug() or something in the ctor.
-
I did it.
I defined QSharedMemory as a poniter, and delete the poniter in the ctor.
it didn't work.
and why the QSharedMemory didn'y release the shared memory.^_^ -
@chris_rookie said in The destructor is not executed:
I did it.
I defined QSharedMemory as a poniter, and delete the poniter in the ctor.You should put a qDebug() statement in there to see if it is printed when you exit the application!
-
Hi,
Out of curiosity, are you trying to avoid having several instances of your application running at the same time ?
If so, there's the QtSingleApplication class for that in the QtSolution repo.
-
@Christian-Ehrlicher
ok, I'll try it.
This is result of my test.
QMetaObject::connectSlotsByName: No matching signal for on_button_close_cliked()
my qDebug output get in the destory function.Thank you. And I wanna ask why the QSharedMemory didn't release.
-
@SGaist
Yes. I wanna do it.
I'll read it.
Thank you.