[GELÖST]QDialog



  • Ich habe mal eine Frage zu QDialog.
    Wenn ich einen Dialog habe und ihn durch eine singal slot verbindung mit clicked und exec verbinde, startet er ja durch einen Klick auf den von mir festgelegten Button.
    So in meinem Buch steht nun dass wenn man im Dialog zum Beispiel Ok klickt, wird der Dialog nicht beendet bzw zerstört sondern nur versteckt.
    Was bedeutet dies? und vor allem wann wird er denn beendet.
    Dachte nämlich eg klicke ich dann auf Ok gibt exec als Rückgabewert acceptet zurück und ich komm wieder ins Hauptfenster. Drücke ich den Button nun erneut, startet der Dialog erneut, aber er wird ja anscheinend immer nur versteckt...?

    Und dann hätte ich noch eine Allgemeine Verständnisfrage:
    [cpp]
    int main( int argc, char* argv[] )
    {
    QApplication app( argc, argv );
    myWindow* window = new myWindow;
    window->show();
    return app.exec();
    }
    Mit show wird ja einfach nur das Window angezeigt, die eigentliche anwedung startet ja erst in der letzten zeile mit exec.
    Verstehe ich das Richtig dass dann einfach die Application gestartet wird und quasi dann alles übernimmt, also Klicks und so und dies an die richtigen Klassen weiterleitet, die dann die Aufgaben durchführen.
    Und das Programm endet dann eben mit quit().
    Danke schonmal



  • Mit app.exec() beginnt die Event/Main-Loop.



  • Ok und die Event/Main-Loop macht genau das was ich gepostet habe oder?
    Habe ich also richtig verstanden, ist ja quasi wie ne while schleife?
    Und kann mir jemand auch die Dialogsfrage beantworten;-)



  • fr33g schrieb:

    Dachte nämlich eg klicke ich dann auf Ok gibt exec als Rückgabewert acceptet zurück und ich komm wieder ins Hauptfenster. Drücke ich den Button nun erneut, startet der Dialog erneut, aber er wird ja anscheinend immer nur versteckt...?

    das kommt drauf an, wie du das bei dir geregelt hast.

    In der Regel wird bei dir der Dialog wohl so gestartet:

    MyDialog* d = new MyDialog(this);
    
    if (d->exec() == QDialog::Accepted)
      // tu was
    

    dann wird der Dialog jedesmal neu erstellt. Der alte wird nach dem schließen versteckt und von Qt automatisch gelöscht oder du kannst ihn manuell löschen, wenn du befürchtest, der User ruft den Dialog sehr oft auf.

    Du kannst den Dialog auch als Attribut deiner Klasse speichern und von da aus jedesmal starten. Ein erneuter Aufruf von exec bringt den Dialog dann nur wieder nach vorne, alle zuvor eingetragenen Werte bleiben so erhalten



  • Ja, die Event/Main-Loop wartet auf Ereignisse (Events). Sprich genau das was du geschrieben hast.

    Für die 2. Frage muss die wer anderer helfen.



  • Ok, also dann wäre ja erst mal die Applicationsfrage beantwortet.
    Dafür schonmal Danke.
    Zu der anderen Frage, hier mal mein Code.
    myDialog.h

    #ifndef MYDIALOG_H
    #define MYDIALOG_H
    
    #include <QDialog>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QLabel>
    
    class myDialog : public QDialog
    {
        Q_OBJECT
        public:
            myDialog();
        public slots:
            void mySetResult();
    };
    
    #endif // MYDIALOG_H
    

    myWidget.h

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QLabel>
    #include "myDialog.h"
    
    class myWidget : public QWidget
    {
        Q_OBJECT
    
        public:
            myWidget( const char* qstr = "Bitte Button betätigen", QWidget* parent = 0 );
        private slots:
            void checkInputDialog();
            void checkInputDialog( int );
        private:
            QPushButton* button0;
            QLabel* label1, *label2;
            QVBoxLayout* layout;
            myDialog* dialog;
    };
    
    #endif // MYWIDGET_H
    

    myDialog.cpp

    #include "myDialog.h"
    
    // neue Widget-Klasse vm eigentlichen Widget ableiten
    myDialog::myDialog()
    {
        setFixedSize( 400, 200 );
        QVBoxLayout* vbox = new QVBoxLayout;
        QLabel* label = new QLabel( "Bitte Button betätigen" );
        QPushButton* button01 = new QPushButton( "Ok" );
        QPushButton* button02 = new QPushButton( "Abbrechen" );
        QPushButton* button03 = new QPushButton( "Ignorieren" );
    
        button01->setDefault( true );
        vbox->addWidget( label );
        vbox->addWidget( button01 );
        vbox->addWidget( button02 );
        vbox->addWidget( button03 );
        setLayout( vbox );
        connect( button01, SIGNAL( clicked() ), this, SLOT( accept() ) );
        connect( button02, SIGNAL( clicked() ), this, SLOT( reject() ) );
        connect( button03, SIGNAL( clicked() ), this, SLOT( mySetResult() ) );
    }
    
    void myDialog::mySetResult()
    {
        int result = 99;
        emit done( result );
    
    }
    

    myWidget.cpp

    #include "myWidget.h"
    #include "myDialog.h"
    #include <QApplication>
    
    // neue Widget-Klasse vom eigentlichen Widget ableiten
    myWidget::myWidget( const char* lab, QWidget* parent ):
            QWidget( parent )
    {
        // Elemente des Widgets erzeugen
        button0 = new QPushButton( "Dialog starten" );
        layout = new QVBoxLayout( this );
        label1 = new QLabel( lab );
        label2 = new QLabel;
        dialog = new myDialog;
        // Programm nicht beenden, wenn Dialog zerstört wird
        dialog->setAttribute( Qt::WA_QuitOnClose );
        // Elemente des Widgets anordnen/anpassen
        layout->addWidget( label1 );
        layout->addWidget( button0 );
        layout->addWidget( label2 );
    
        // Signal- und Slots-Verbindungen einrichten
        connect( button0, SIGNAL( clicked() ), dialog, SLOT( exec() ) );
        connect( dialog, SIGNAL( accepted() ), this, SLOT( checkInputDialog() ) );
        connect( dialog, SIGNAL( rejected() ), this, SLOT( checkInputDialog() ) );
        connect( dialog, SIGNAL( finished( int ) ), this, SLOT( checkInputDialog( int ) ) );
        setWindowTitle( "Hauptfenster - Anwendung" );
    }
    
    void myWidget::checkInputDialog()
    {
        int val = dialog->result();
        if( val == QDialog::Accepted )
        {
            label2->setText( "\"OK\" wurde gewählt" );
        }
        else if( val == QDialog::Rejected )
        {
            label2->setText( "\"Abbrechen\" wurde gewählt" );
        }
    }
    
    void myWidget::checkInputDialog ( int val )
    {
        val = dialog->result();
        if( val == 99 )
        {
            label2->setText( "\"Ignorieren\" wurde gewählt" );
        }
    }
    

    und die main

    #include <QApplication>
    #include "myWidget.h"
    
    int main( int argc, char* argv[] )
    {
        QApplication app( argc, argv );
        myWidget* window = new myWidget;
        window->show();
        return app.exec();
    }
    


  • zwutz schrieb:

    fr33g schrieb:

    Dachte nämlich eg klicke ich dann auf Ok gibt exec als Rückgabewert acceptet zurück und ich komm wieder ins Hauptfenster. Drücke ich den Button nun erneut, startet der Dialog erneut, aber er wird ja anscheinend immer nur versteckt...?

    das kommt drauf an, wie du das bei dir geregelt hast.

    In der Regel wird bei dir der Dialog wohl so gestartet:

    MyDialog* d = new MyDialog(this);
    
    if (d->exec() == QDialog::Accepted)
      // tu was
    

    dann wird der Dialog jedesmal neu erstellt. Der alte wird nach dem schließen versteckt und von Qt automatisch gelöscht oder du kannst ihn manuell löschen, wenn du befürchtest, der User ruft den Dialog sehr oft auf.

    Du kannst den Dialog auch als Attribut deiner Klasse speichern und von da aus jedesmal starten. Ein erneuter Aufruf von exec bringt den Dialog dann nur wieder nach vorne, alle zuvor eingetragenen Werte bleiben so erhalten

    Also ich habe ja hier mal gepostet wie mein Code, aussieht, könntest du mir jetzt vll nochmal dafür erklären wie das abläuft, bzw was das bedeutet der Dialog wird nur versteckt und nicht zerstört.
    Danke schonmal=)


Anmelden zum Antworten