[SOLVED] Closing QMainWIndow
-
I have two QMainWindow instances, one of which is parent to the other. The problem I'm having is that if I close the child QMainWindow using the window close button, the window closes and focus returns to the parent, BUT, if I close it via a menu item (connected to the window's close slot), both windows close and the application terminates.
Two questions:
-
Is it acceptable to instantiate two QMainWindow classes, with one being parent to the other, or should I use a different class for the child QMainWindow? I really need two windows with toolbars, status bar and whatnot, though.
-
If 1) above is not an issue, how can I prevent closing the child QMainWindow from shutting down the application?
-
-
I don't know if there is a problem using two QMainWindow classes. There might be but if it works then I don't see an issue.
You can override the protected closeEvent() method. You can prevent the window from closing with something like this in a subclass:
@
void MyWindow::closeEvent(
QCloseEvent *Event)
{
if(cannot_close == true)
{
Event->ignore();
return;
}Event->accept();
}
@The problem where one window closes both and terminates makes sense if the second window is a child of the first. It should work this way.
If you create a third common window and have the two QMainWindow classes children of this it should prevent this problem. Both of the children will be independent. The only downside I can think of is that you will have a third window.
Maybe creating both QMainWindow widgets inside of main() and don't make one a child of the other? I never tried this but it might work.
@
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(appname);
QApplication Application(argc, argv);MyWindow *win1 = new MyWindow; MyWindow *win2 = new MyWindow; win1->show(); win2->show(); return Application.exec();
}
@ -
Hi,
There's no problem with that however it's unusual. Why two QMainWindow ?
So you have a QAction in your second window which triggers that window close slot ? Correct ?
Where do you setup that connection ?
By the way, what version of Qt and OS are you running ?
-
I have nested main windows in a few applications with no problem.
You problem is mostly likely related either to auto - or manual connection of the menu slots to appropriate slots of both windows instead of one.
But if I misunderstood and you want both windows exist independently you should not make one child of another. -
[quote author="SGaist" date="1423606212"]There's no problem with that however it's unusual. Why two QMainWindow ?[/quote]
I think my first question should have been worded differently. The issue at hand is that there must be two windows each sporting a toolbar and a menu and status bars. So then the question is should I use a QMainWindow for the main window and another QMainWindow for the second one (child to main) or should I use a different class for the second window, if one exists that supports toolbars and menu/status bars? The first window already has a stacked widget showing different "pages".
[quote author="SGaist" date="1423606212"]So you have a QAction in your second window which triggers that window close slot ? Correct ?[/quote]
Yes, the action is setup on the menu/toolbar's close action being triggered and invokes the window's close() method; this was done in Qt Creator's designer.
[quote author="SGaist" date="1423606212"]By the way, what version of Qt and OS are you running ?[/quote]
Using Linux and Qt's latest stable. Speaking of which, is it advisable to develop for Qt5? I don't develop in Python but I heard many awful things said of Python 3, with many developers opting to stay with Python 2.6 instead (I think). I take it the same sort of thing does not apply to Qt5 vs Qt4?
-
[quote author="alex_malyu" date="1423618036"]I have nested main windows in a few applications with no problem.[/quote]
[quote author="alex_malyu" date="1423618036"]You problem is mostly likely related either to auto - or manual connection of the menu slots to appropriate slots of both windows instead of one. But if I misunderstood and you want both windows exist independently you should not make one child of another.[/quote]
Well, the child window is shown by triggering an action in the main window, which means it cannot exist without the main window. I never thought that closing the child window would automatically terminate the application. The funny thing is that closing the child window via the window's own close button -- so not via the menu/toolbar action -- works as intended.
-EDIT This is bugging me. Anyone knows what method is invoked internally by QT when the window's close button is clicked on or the user hits ALT-F4/CTRL-W ?-
-EDIT2 Making the child window parentless still results in the application terminating when the close() method is invoked.-
-
Ok. Problem solved. It was my mistake all along as I was deleting the child window immediately upon receiving its closed signal, which, I found out just now with some searches, is a no-no; using deleteLater() instead works as intended!
Would still appreciate some answers to the questions above, though!
-
Since there are severals and some that are stroke through, which questions exactly ?
-
[quote author="SGaist" date="1423699961"]Since there are severals and some that are stroke through, which questions exactly ?[/quote]
These two, please:
-
Should I use a QMainWindow for the main window and another QMainWindow for the second one (child to main) or should I use a different class for the second window, if one exists that supports toolbars and menu/status bars? The first window already has a stacked widget showing different “pages”.
-
Is it advisable to develop for Qt5? I don’t develop in Python but I heard many awful things said of Python 3, with many developers opting to stay with Python 2.6 instead (I think). I take it the same sort of thing does not apply to Qt5 vs Qt4?
-
-
-
You can use QMainWindow. However you an also build your own widget with these features.
-
All development forces are going in Qt 5, Qt 4 will likely get only one last release. As for python 3 VS 2, I can't tell, until now I've only used 2. You should rather try yourself to see which one suits your needs.
-