当前位置:网站首页>Some instructions on whether to call destructor when QT window closes and application stops
Some instructions on whether to call destructor when QT window closes and application stops
2022-07-06 16:53:00 【Flower dog fdog】
I have been imitating these days QQ Make an instant messaging software , The process is not very smooth , When the window closes , Applications still exist , The application ended abnormally , Close subwindow , The main window closes , So I summarized some contents , Convenient for future access .


If you are interested in this project, you can go to GitHub:https://github.com/FdogMain/FdogInstantMessaging
main Function , Windows created on the stack , Call destructor automatically when closing , This situation cannot be used this->setAttribute(Qt::WA_DeleteOnClose);, An exception occurs when closing , If it is created on the heap , You can use this->setAttribute(Qt::WA_DeleteOnClose), When calling destructors , There will be no exceptions .
When the window is closed close function , This function sends a close event QCloseEvent, Then the window will be hidden , Ask if you want to close , Can intercept QCloseEvent event , Which is rewriting QCloseEvent, Users can choose to close , Or cancel .
In does not add Qt::WA_DeleteOnClose when , Choose to turn off , The window will disappear , Actually called hide, If you add it , In addition to the call hide, It also calls deleteLater Method to release the window , Without this attribute ,close and hide, also servisibel The function of is the same , It just hides the window object , It doesn't destroy objects .
stay main, Create a window on the stack A, close window A when , Will call the destructor .
If in this window A Create another window in the constructor of B, And in A In the destructor of B To release .
The first form :
MainWindow * b = new MainWindow();
When closing the window A, Then close the window B when , establish B The destructor of is called , window A The destructor of is called ( This closing method has obvious jamming , When off A, According to the rules ,B Should be turned off , Release , however B The window is also displayed on the desktop , Multiple runs , Find that there will still exist A The problem of non execution of deconstruction ( The printed statements in the destructor are not printed on the console ), So there are problems in this way )
In turn, , Close the window first B, Then close the window A,B The destructor of is called , window A The destructor of is called ( This closing method has no jamming , It's actually B The window is hidden , Failure to actively perform deconstruction , And in the A Passive execution in the destructor of , That's why it's closed B when , The display does not call B destructor , Shut down A when , To display the call B Cause of destructions )
We give the window B add to Qt::WA_DeleteOnClose Have a try ( Add... To the constructor setAttribute(Qt::WA_DeleteOnClose)), Because of the window B It's the window on the pile , have access to setAttribute(Qt::WA_DeleteOnClose)),
Or close the window first A, Then close the window B, Show that the window was called B Destructor of , Then there's an exception , This exception should be repeated destructions B Sent exception .
Put the window A About windows B Remove the released code , Show that the window was called B Destructor of , Call window A Destructor of , But there were no exceptions ( There's stuck , Multiple runs , Find that there will still exist A The problem of non execution of deconstruction ( The printed statements in the destructor are not printed on the console )).
Now the reverse is true , Close the window first B, Because of the window B Set up setAttribute(Qt::WA_DeleteOnClose)) attribute , The destructor is executed immediately , Then close the window A, If nothing happens , There should be an exception , Because of the window B Has been released , In the window A Release again B Abnormal transactions , hold A Release in destructor in B The code is commented again , function , The display calls the windows in turn B Destructor of , window A Destructor of ( No caton ).
The second form , Specify the parent window
MainWindow * b = new MainWindow(this);
A The window destructor has no write release B Window code case :
close A window ( Be released ),B The window closes ( Be released )( No caton ).
close B window ( Just hide ), close A window ( Be released )( No caton ).
Try again b add to setAttribute(Qt::WA_DeleteOnClose)) attribute , close B window , perform B destructor , To shut down A, perform A The analysis of ( No caton ).
close A window , perform A The analysis of , perform B The analysis of , also B The window is closed ( No caton ).
This is because QT The parent-child object mechanism of is at work , The reason lies in that this.
When we use the parent object to create an object , The parent object will add this object to its child object list . When the parent object is deleted , It will traverse its sub object class table and delete each sub object , Then the sub objects themselves delete their own sub objects , This calls recursively until all objects are deleted , So if new Out of the control , If a parent object is specified , We don't need to delete it manually .
Another discovery , If other controls are specified A Window as parent window , Will be embedded in A Window , however MainWindow Windows of this class will not be embedded
The opposite is not true .
But the above is only in the basic case , When I set the window property to borderless , After no taskbar and other different attributes , Close the window again , Destructors are not called automatically , In other words, the window is just closed , But the application itself has not been closed , The most obvious feature is when you close the window ,qt The output window of the application still shows red squares instead of green triangles .
At this time, you can add the following code where you want to close , The application will be closed .
QApplication* app;
app->quit();
There is also a situation where MainWindow Created in widget window , But one closes the last widget,MainWindow Will be shut down , Is it inconceivable , Before finding a solution , I can only judge whether it is the last widget, If it was me, I would hide , Instead of closing , for instance .
for example qq The main interface is MainWindow Double click friend generation widget window .
When closing these widget When the window comes to the last , The main window will close , One of the reasons for this symptom , Is to set the properties of the window
That is to use this function setWindowFlags(), In for a penny, in for a pound , Put this widget Add another attribute to the window setWindowFlag(Qt::CoverWindow);
This problem may not exist ~
Another problem is to close the window , The program may end abnormally , This mistake is also related to main The location of the window created in .
边栏推荐
- LeetCode 1551. Minimum operand to make all elements in the array equal
- 7-7 ring the stupid bell
- 这群程序员中的「广告狂人」,把抖音广告做成了AR游戏
- ~69 other ways to use icon fonts
- 这116名学生,用3天时间复刻了字节跳动内部真实技术项目
- One hundred questions of image processing (1-10)
- 第6章 DataNode
- How to configure hosts when setting up Eureka
- ~85 transition
- JS encapsulates the method of array inversion -- Feng Hao's blog
猜你喜欢

Use JQ to realize the reverse selection of all and no selection at all - Feng Hao's blog

第7章 __consumer_offsets topic

Soft music -js find the number of times that character appears in the string - Feng Hao's blog

The most lost road I have ever walked through is the brain circuit of ByteDance programmers

Full record of ByteDance technology newcomer training: a guide to the new growth of school recruitment

字节跳动新程序员成长秘诀:那些闪闪发光的宝藏mentor们

~84 form supplement

~Introduction to form 80

7-5 blessing arrived

「博士毕业一年,我拿下 ACL Best Paper」
随机推荐
~82 style of table
Solve the problem that intel12 generation core CPU single thread only runs on small cores
7-7 ring the stupid bell
was unable to send heartbeat
Shell_ 03_ environment variable
Shell_ 05_ operator
7-5 blessing arrived
~Introduction to form 80
DS18B20数字温度计系统设计
~68 Icon Font introduction
这116名学生,用3天时间复刻了字节跳动内部真实技术项目
The most lost road I have ever walked through is the brain circuit of ByteDance programmers
How to generate six digit verification code
One hundred questions of image processing (1-10)
LeetCode 1984. Minimum difference in student scores
How to configure hosts when setting up Eureka
Spark's RDD (elastic distributed data set) returns a large result set
第五章 Yarn资源调度器
腾讯面试算法题
~85 transition