当前位置:网站首页>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 .
边栏推荐
猜你喜欢
~68 Icon Font introduction
was unable to send heartbeat
Simply try the new amp model of deepfacelab (deepfake)
LeetCode 1558. Get the minimum number of function calls of the target array
Two weeks' experience of intermediate software designer in the crash soft exam
Ffmpeg command line use
【锟斤拷】的故事:谈谈汉字编码和常用字符集
J'ai traversé le chemin le plus fou, le circuit cérébral d'un programmeur de saut d'octets
字节跳动2022校招研发提前批宣讲会,同学们最关心的10个问题
~76 sprite map
随机推荐
Data config problem: the reference to entity 'useunicode' must end with ';' delimiter.
ByteDance 2022 school recruitment R & D advance approval publicity meeting, students' top 10 issues
Chapter 5 yarn resource scheduler
第一章 MapReduce概述
Redis standalone startup
第6章 DataNode
两个礼拜速成软考中级软件设计师经验
Story of [Kun Jintong]: talk about Chinese character coding and common character sets
Li Kou leetcode 280 weekly match
Error: case label `15 'not within a switch statement
腾讯面试算法题
姚班智班齐上阵,竞赛高手聚一堂,这是什么神仙编程大赛?
How to generate six digit verification code
第5章 NameNode和SecondaryNameNode
Solr new core
~68 Icon Font introduction
Audio and video development interview questions
LeetCode 1984. Minimum difference in student scores
@RestController、@Controller
~81 long table