Solved Enabling and Disabling Window Widgets?
-
Is there anyway (that works) to enable or disable specific window widgets?
I've tried using the window flags to set the enable and disable specific flags for specific window widgets to prevent resizing and or maximizing a window, but it doesn't work and the widgets are still enabled.
I'm using Qt 5.11 on an iMAC running iOS Mojave.
Having just searched around for alternate solutions, I haven't tried but will when I get back to my system...getting the widget and then calling setEnabled(true/false) directly instead of using the window flags (setWindowFlags).
-
Hi,
Can you provide a minimal compilable example that shows what you are trying to do ?
-
I'll try tonight when I have access to my system...it isn't difficult to replicate, presently I'm modifying the window flags to disable window widgets, but it doesn't seem to work.
-
@SPlatten
you can try theQt::MSWindowsFixedSizeDialogHint
window flag together withsetSizeGripEnabled(false)
the flag is obviously for Windows only, I'm unsure what the equivalent is for MacOS.
This however should prevent the user from resizing the the (standalone) window without removing the buttons or borders all together.
This is what I think you're trying to do. Correct my if I'm wrong.
-
Thank you, I am looking for a method of programmatically enabling and disabling any of the widgets (close/minimize/maximize/context help/title/system menu). Also the solution needs to be compatible with Windows, Linux and iOS.
-
Here is the code I use to set the window flags:
if ( strPropName.compare(clsXMLnode::mscszPropertyClose) == 0 ) { if ( strPropValue.compare(clsXMLnode::mscszTrue) == 0 ) { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) | Qt::WindowCloseButtonHint); } else { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowCloseButtonHint); } } else if ( strPropName.compare(clsXMLnode::mscszPropertyFrameless) == 0 ) { if ( strPropValue.compare(clsXMLnode::mscszTrue) == 0 ) { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::FramelessWindowHint); } else { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) | Qt::FramelessWindowHint); } } else if ( strPropName.compare(clsXMLnode::mscszPropertyMaxmize) == 0 ) { if ( strPropValue.compare(clsXMLnode::mscszTrue) == 0 ) { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) | Qt::WindowMaximizeButtonHint); } else { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint); } } else if ( strPropName.compare(clsXMLnode::mscszPropertyMinMax) == 0 ) { if ( strPropValue.compare(clsXMLnode::mscszTrue) == 0 ) { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) | Qt::WindowMinMaxButtonsHint); } else { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint)); } } else if ( strPropName.compare(clsXMLnode::mscszPropertyMinimize) == 0 ) { if ( strPropValue.compare(clsXMLnode::mscszTrue) == 0 ) { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) | Qt::WindowMinimizeButtonHint); } else { pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMinimizeButtonHint); } }
The above is typical for all flags. pobjWidget:
if ( strNodeName.compare(clsXMLnode::mscszNodeWindow) == 0 ) { pobjWidget = static_cast<QWidget*>(pobjCtrl); }
In the above example pobjCtrl will be a pointer to the window widget. This works for the minimise widget, it doesn't work for the close and maximise / restore widgets.
[Edit] Found some posts online which detail how to disable resizing:
setSizeGripEnabled(false);
I would have expected that since flags exist for these to work, they don't. This won't solve my problem as the method is part of QStatusBar, my window doesn't have a status bar and shouldn't need it to disable sizing.
QWindow has a method called setFlags, is this the same as calling the setWindowFlags on the widget?
@J.Hilk, Just reading your post again, yes your solution is for windows only. How do I do this for Windows, iOS and Linux, I would have thought this would be handled by Qt.
@SGaist, is the code I've posted sufficient?
-
I tried:
pobjWidget->setWindowFlags((pobjWidget->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint); QRect rctGeom = pobjWidget->geometry(); pobjWidget->setFixedSize(rctGeom.width(), rctGeom.height());
Didn't work widget still accessible.
-
@SPlatten said in Enabling and Disabling Window Widgets?:
@SGaist, is the code I've posted sufficient?
No it's not, it doesn't allow anybody to easily reproduce what you are doing.
-
Hi
If i may suggest a different approach.
Try running
http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html
on your platform(s) and see what the combinations gives/shows. -
@mrjj , Thank you, I'll try this tonight, 7:40 am now, I'm not back at my system until 18:00 tonight.
-
@mrjj, I downloaded all the files and built the demo, just to recap, the version of OSX I'm running on my macBook Pro is High Sierra version 10.13.6.
The version of Qt is 5.11.2 (Clang 8.0 (Apple) 64 bit). I would love to say the application worked and has solved all my problems, I was planning to debug it and then replicate how it works, sadly its no better than my code.
This is what I've done, launch the application, the default settings are:
Radio buttons, Window selected and Preview child window displayed.
All checkboxes unchecked.Here is what happens:
MS Windows fixed size dialog
unchecked, I can resize the preview window
checked, no effect on preview window, I can still do everything I could without it checkedFrameless window
unchecked, window title and widgets visible
checked, window title and widgets removedNo drop shadow
unchecked, window has drop shadow
checked, window doesn't have drop shadowWindow title, unchecked or checked, no effect
Window system menu, unchecked or checked, no effect
Customize window, seems to have same effect as Frameless window
Window minimize button, unchecked or checked, no effect
Window maximise button, unchecked or checked, no effect
Window close button, unchecked or checked, no effect
Window context help button, unchecked or checked, no effect
Window shade button, unchecked or checked, no effectWindow stays on top
unchecked, window doesn't stay on top
checked, window stays on topWindow stays on bottom, unchecked or checked, no effect
Overall very disappointing it seems that most of the hints have no effect at all, surely this is a bug that needs attention ?
-
Just to be sure we are on the same page: are you trying to develop a desktop like application for iOS ?
-
@SGaist, I'm trying to develop a desktop application that ultimately can be run on any OS supported by Qt, including Windows, iOS and Linux.
-
You have to take into account that iOS and Android don't offer the same kind of window management as the desktop OSs and that's nothing Qt can do about. For example, on mobile OSs you usually have one full screen application where you can have some dialogs but it's not comparable to what Linux, macOS or others have for you through e.g. Xorg or wayland.
-
Sorry, I forgot to add OSX to the list and thats what my tests have been on my MacBook Pro running OSX High Sierra version 10.13.6
I accept what you are saying with respect to Android and iOS, but the isn't one of those.
Please download the same example code as posted in the link by mrjj, report back with OS version and Qt version if you find anything different...
-
@SPlatten
Hi
Sorry should have mentioned it.
The samples are directly available in Creator with a normal install.
Sadly i cant help testing as i have no access to any Macs.
-
The point is Qt is supposed to be multi-platform, I don't have a Windows PC or Linux, only Mac's and clearly it doesn't appear to work.
-
@SPlatten
Well not all hints are supported on all platforms.
The name is often a give away
like Qt::MSWindowsFixedSizeDialogHint
Note the MS in front.
or like X11BypassWindowManagerHint which is for linux / X11
Its mention here.
http://doc.qt.io/qt-5/qt.html#WindowType-enumThe MSWindowsFixedSizeDialogHint do work on Windows.
-
Sorry, for a product as mature as Qt this isn't what I would expect, I know this kind of thing is perfectly possible, just Qt doesn't currently work correctly.
-
@SPlatten
Well it depends on platform and the Windows manger in use.
Some combinations are not possible in Windows either.
Also some windows mangers on linux also ignore certain Hints.
You are aware that Qt does not draw the decorations by its self ?
Its handled by the OS and might not offer any way to apply it
and Qt would have to resort to custom drawn decorations.