Quantcast
Viewing all articles
Browse latest Browse all 4972

MessageDialog hidden behind main window :-(

Hi, apologies if this is the 100th repetition of an old question but I’m new to Qt and my google skills didn’t help to turn up a working solution. What I’m trying to do is to display a MessageDialog (from QtQuick Controls) before the main window is shown/accessible. Initially, I tried to show the Message Dialog as standalone using code in main.cpp but I never got that working so decided to use another, qml based, approach: Blankout everything in the main window when it loads. Display the dialog from inside the main window. If the user clicks ‘Ok’ show all the other stuff in the main window. I got that working reasonably well except that the Message Dialog opens behind the main window. That is quite annoying because the users will have to figure out why they can’t do anything in the main window but sooner or later they’ll find the dialog hidden behind the main window. However, if the main window starts in fullscreen mode then my users will have a real problem because the dialog is still hidden behind the main window. Here’s my sample code: MyDialog.qml: import QtQuick 2.0 import QtQuick.Dialogs 1.1   MessageDialog {     id: myDialog     icon: StandardIcon.Warning     modality: Qt.ApplicationModal     title: "myDialog"     text: "some dialog"     standardButtons: StandardButton.Abort | StandardButton.Ok } main.qml: import QtQuick 2.0 import QtQuick.Controls 1.1     ApplicationWindow {     id: root     width:  1000     height:  750     color:  "#333333"       /** blockScreen:  Covers almost everything until the user clicked 'Ok'      *                in the dialog.      *  myDialog:     This is the actual dialog. If the user clicks 'Ok'      *                the other contents will be revealed, otherwise the      *                program quits.      *  dialogPassed: This variable registers whether the user has already      *                seen myDialog and clicked 'Ok' or whether the user      *                still has to see the dialog.      *  onVisibilityChanged: Everytime the      *                application is launched, minimised or maximised this      *                signal triggers. The first time that it triggers is      *                necessarily when the application is being launched      *                and that's when myDialog needs to be displayed.      *                Thanks to dialogPassed all the other times it's      *                triggered do not matter.      */     Rectangle {         id: blockScreen         anchors.fill: parent         color: "#ff0000"     }       MyDialog {         id: myDialog         onAccepted: {             blockScreen.visible = false         }         onRejected: {             Qt.quit()         }     }       property bool dialogPassed: false       onVisibilityChanged: {         if (!dialogPassed) {             myDialog.open()             dialogPassed = true         }     }   } main.cpp: #include <QtGui/QGuiApplication> #include <QQmlEngine> #include <QQmlComponent> #include <QQuickWindow> #include <QObject>   int main(int argc, char *argv[]) {     // Setup the GUI:     QGuiApplication app(argc, argv);     QQmlEngine *engine = new QQmlEngine();     app.connect(engine, SIGNAL(quit()), SLOT(quit()));     QQmlComponent *component = new QQmlComponent(engine);     component->loadUrl(QUrl("qml/bugDemo/main.qml"));     if (!component->isReady()) {         qWarning("%s", qPrintable(component->errorString()));         return(-1);     }       // Start the GUI:     QObject *topLevel = component->create();     QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);     window->show();     return app.exec(); } And that’s a screenshot of what I get: As you can see the MessageDialog is hidden behind the window. Where is my mistake? Is there a better solution to do this? Thanks, Jack

Viewing all articles
Browse latest Browse all 4972

Trending Articles