When window goes fullscreen, show something different
-
Hey there,
I currently work on a macOS-only application (don't want to port my app at the moment) and I want to do some simple thing which doesn't quite work as I except.
Anytime when a user maximizes my QMainWindow (it would go fullscreen then, over the green button in the macOS bar) I want to show another window (based on QWidget) instead of my QMainWindow going fullscreen. I tried it with changeEvent() just like this.// just some testin' around void MainWindow::changeEvent(QEvent *event) { QWidget *testWidget = new QWidget(); if (event->type() == QEvent::WindowStateChange) { if (isMaximized()) { testWidget->showFullScreen(); } } }
Sadly, this doesn't do anything. Any thoughts how I can achieve this? I just want to catch if someone tries to maximize/fullscreen the app over the titlebar and when yes just show another window in fullscreen and let my QMainWindow stay as it is.
Kind regards,
Jan -
Hey there,
I currently work on a macOS-only application (don't want to port my app at the moment) and I want to do some simple thing which doesn't quite work as I except.
Anytime when a user maximizes my QMainWindow (it would go fullscreen then, over the green button in the macOS bar) I want to show another window (based on QWidget) instead of my QMainWindow going fullscreen. I tried it with changeEvent() just like this.// just some testin' around void MainWindow::changeEvent(QEvent *event) { QWidget *testWidget = new QWidget(); if (event->type() == QEvent::WindowStateChange) { if (isMaximized()) { testWidget->showFullScreen(); } } }
Sadly, this doesn't do anything. Any thoughts how I can achieve this? I just want to catch if someone tries to maximize/fullscreen the app over the titlebar and when yes just show another window in fullscreen and let my QMainWindow stay as it is.
Kind regards,
JanChangeEvent
is not the right event for this.
https://doc.qt.io/qt-5/qwidget.html#changeEventTry
ResizeEvent
instead.
https://doc.qt.io/qt-5/qwidget.html#resizeEvent@l1psync said in When window is maximized, show something different:
I want to show another window (based on QWidget) instead of my QMainWindow going fullscreen.
I dont know what will happen, if you show two fullscreen windows, because like this, you cannot prevent the first window from getting expanded to fullscreen. So the first window is shown in fullscreen mode and the
testWidget
afterwards (some msecs delay) -
Thank you but this does not work either. Here nothing really happens.
void MainWindow::resizeEvent(QResizeEvent *event) { if (isMaximized()) { fsWindow->show(); } }
No matter how I change it (even with
event->type() ==
).Is there no real way to catch up the title bar interaction in general? Something like "isGoingFullScreen"?
-
Thank you but this does not work either. Here nothing really happens.
void MainWindow::resizeEvent(QResizeEvent *event) { if (isMaximized()) { fsWindow->show(); } }
No matter how I change it (even with
event->type() ==
).Is there no real way to catch up the title bar interaction in general? Something like "isGoingFullScreen"?
-
@l1psync
Hi
isMaximized() is not the same as isFullScreen()
so make sure you are checking the right thing.@mrjj
Thanks, I forgot that (maximize/fullscreen in macOS is very irritating).So
resizeEvent
didn't work so I tried again withchangeEvent
void MainWindow::changeEvent(QEvent *event) { if (event->type() == QEvent::WindowStateChange) { if (isFullScreen()) { fsWindow->showFullScreen(); } } }
That works actually but not in the behavior I want! When I now go fullscreen you can see that my QMainWindow is fullscreen and then shows the other window in fullscreen, you get a short view into that and then it switches into a black view. When I switch back I can go back to my new fullscreen window, if I close it my QMainWindow is not there. I am really confused right now...
I think the black "fullscreen" window is actually my QMainWindow but it does not get "painted"... Any thoughts on that?EDIT: Ok, interesting, when I go out of fullscreen in my new window, I can see my QMainWindow behind the UI.
The black "fullscreen" view still exists...
https://streamable.com/r65x2 (video) -
@mrjj
Thanks, I forgot that (maximize/fullscreen in macOS is very irritating).So
resizeEvent
didn't work so I tried again withchangeEvent
void MainWindow::changeEvent(QEvent *event) { if (event->type() == QEvent::WindowStateChange) { if (isFullScreen()) { fsWindow->showFullScreen(); } } }
That works actually but not in the behavior I want! When I now go fullscreen you can see that my QMainWindow is fullscreen and then shows the other window in fullscreen, you get a short view into that and then it switches into a black view. When I switch back I can go back to my new fullscreen window, if I close it my QMainWindow is not there. I am really confused right now...
I think the black "fullscreen" window is actually my QMainWindow but it does not get "painted"... Any thoughts on that?EDIT: Ok, interesting, when I go out of fullscreen in my new window, I can see my QMainWindow behind the UI.
The black "fullscreen" view still exists...
https://streamable.com/r65x2 (video)Maximize and FullScreen are different things on every OS, not only on macOS :)
Didn't notice that you are talking about Fullscreen but wrote Maximize.
As I said, you cannot prevent the MainWindow from getting to Fullscreen Mode this way, but it should be possible in general.
There are some similar threads in this forum, but for MS Windows only.Edit:
Ref your edited post:
I guess the OS loses the MainWindow after both windows are in fullscreen mode, because there can only be one fullscreen window at a time.
So it's not getting updated / repainted anymore.
If you find a way to interrupt the MainWindow from being expanded to fullscreen, then you should be fine :)
(You'll need to access the macOS window manager) -
Maximize and FullScreen are different things on every OS, not only on macOS :)
Didn't notice that you are talking about Fullscreen but wrote Maximize.
As I said, you cannot prevent the MainWindow from getting to Fullscreen Mode this way, but it should be possible in general.
There are some similar threads in this forum, but for MS Windows only.Edit:
Ref your edited post:
I guess the OS loses the MainWindow after both windows are in fullscreen mode, because there can only be one fullscreen window at a time.
So it's not getting updated / repainted anymore.
If you find a way to interrupt the MainWindow from being expanded to fullscreen, then you should be fine :)
(You'll need to access the macOS window manager) -
@pl45m4 Even though the QMainWindow is going to fullscreen, its ok for me for first (probably later try minimizing the app). But this strange behavior that some random black fullscreen view opens up is confusing me...
-
Do you see the window title of that black window? Or anything which identifies the black window, so you can see where it actually comes from?
@pl45m4
No I cannot see the title bar nor the menu bar.There can be a lot of fullscreen windows because each window then is getting its „own desktop“.
My thoughts were that the black view and the QMainWindow are in real one piece and result in a fullscreen QMainWindow. I tried
repaint
on it but this does not work. -
@pl45m4
No I cannot see the title bar nor the menu bar.There can be a lot of fullscreen windows because each window then is getting its „own desktop“.
My thoughts were that the black view and the QMainWindow are in real one piece and result in a fullscreen QMainWindow. I tried
repaint
on it but this does not work. -
Ok, the "own-desktop"-thing is Mac related (I'm not a mac-expert)
What happens if you set only the MainWindow to fullscreen without the new widget? Do you get a black screen on one virtual desktop too?
-
I am now 100% sure the black view has something to do with my application. When I move into the "desktop overview" I can see that the black view has the name of my application. So its probably that the QMainWindow does not gets painted.
I think I know what the problem is and that is on the side of macOS. When I call just
show
my new QWidget is just showing up without any mistakes (but not in fullscreen). The problem here is probably that I try to launch another window in fullscreen while I am in fullscreen. So the solution to that would be catching up before we go fullscreen. But as I think there's no Qt solution to that, or am I wrong? -
BOOM, I got this!
void MainWindow::changeEvent(QEvent *event) { if (event->type() == QEvent::WindowStateChange) { Qt::WindowStates state = this->windowState(); // debug reasons if (this->windowState() == Qt::WindowFullScreen) { appIsFs = true; showEditViewFs(); } } } void MainWindow::showEditViewFs() { if (appIsFs == true) { fsWindow->show(); fsWindow->setWindowState(windowState() & Qt::WindowFullScreen); this->setWindowState(windowState() & ~(Qt::WindowFullScreen)); } }
@Pl45m4 Now I am hanging here at the point that it just ignores the
this->setWindowState(windowState() & ~(Qt::WindowFullScreen));
. -
BOOM, I got this!
void MainWindow::changeEvent(QEvent *event) { if (event->type() == QEvent::WindowStateChange) { Qt::WindowStates state = this->windowState(); // debug reasons if (this->windowState() == Qt::WindowFullScreen) { appIsFs = true; showEditViewFs(); } } } void MainWindow::showEditViewFs() { if (appIsFs == true) { fsWindow->show(); fsWindow->setWindowState(windowState() & Qt::WindowFullScreen); this->setWindowState(windowState() & ~(Qt::WindowFullScreen)); } }
@Pl45m4 Now I am hanging here at the point that it just ignores the
this->setWindowState(windowState() & ~(Qt::WindowFullScreen));
.@l1psync
question, why do you make your 2nd Window as Independent window?Let the QMainWindow go fullscreen, detect that, and simply exchange the content of or QMainWindow.
You can do that for example via setContentWidget, make sure to keep a valid pointer of your original contentWidget to realign it, once the fullscreen exits
-
@l1psync
question, why do you make your 2nd Window as Independent window?Let the QMainWindow go fullscreen, detect that, and simply exchange the content of or QMainWindow.
You can do that for example via setContentWidget, make sure to keep a valid pointer of your original contentWidget to realign it, once the fullscreen exits
-
@l1psync said in When window goes fullscreen, show something different:
@j-hilk Good point, you mean
setCentralWidget()
Yes, of course. Too much QML lately ;)
https://doc.qt.io/qt-5/qmainwindow.html#setCentralWidget -
Hi,
QStackedWidget comes to mind for that.