Neues Fenster (QWidget) erstellen



  • Servus,

    möchte für eine kleine Anwendung gerne ein About Fenster einbinden. Habe hierfür schon über Datei->Neu ein neues GUI erstellt. Nun möchte ich das Fenster über einen Button im MainWindow aufrufen, das sieht wie folgt aus:

    #include "about.h"
    
    ...
    
    void MainWindow::on_pbAbout_clicked()
    {
        About about;
        about.show();
    }
    

    Und so sieht die about.cpp aus:

    #include "about.h"
    #include "ui_about.h"
    
    \1::About(QWidget *parent) :
        QWidget(0),
        ui(new Ui::About)
    {
        ui->setupUi(this);
    }
    
    \1::~About()
    {
        delete ui;
    }
    
    void \1::on_pushButton_clicked()
    {
        delete this;
    }
    

    (Hier noch eine kleine Frage am Rande. Wenn ich im About Fenster dieses über einen weiteren Pushbutton schließen möchte, liege ich da mit delete this richtig?)

    Jedenfalls öffnet sich das neue Fenster bei dem Klick auf den Pushbutton für einen unglaublich kurzen Augenblick und schließt sich sofort wieder. Wenn ich das About Fenster jetzt dagegen in der Main anlege, bleibt es offen. Woran liegt das und was muss ich machen, damit es offen bleibt?

    Gruß



  • Karottenkopf51 schrieb:

    (Hier noch eine kleine Frage am Rande. Wenn ich im About Fenster dieses über einen weiteren Pushbutton schließen möchte, liege ich da mit delete this richtig?)

    Nein! Bitte nicht delete this;! In Ausnahmefällen (!lies: Ausnahme!) kommt das mal vor, sollte aber in jedem normalen Fall (!lies: jedem Fall!) vermieden werden.

    Jedenfalls öffnet sich das neue Fenster bei dem Klick auf den Pushbutton für einen unglaublich kurzen Augenblick und schließt sich sofort wieder.

    Dann überleg mal, wie lange das about-Objekt lebt...



  • Ich dachte eigentlich solange, bis das Objekt gelöscht wird, also der Destruktor aufgerufen wird?



  • Karottenkopf51 schrieb:

    Ich dachte eigentlich solange, bis das Objekt gelöscht wird, also der Destruktor aufgerufen wird?

    Und wann wird der aufgerufen?



  • Am Ende der Methode? Oh verdammt...

    Wie gehe ich denn da am besten vor? Brauche in der Klasse MainWindow ja ein Objekt vom Typ About und dann verwende ich einfach .show() und .hide(), richtig? Allerdings kann ich nicht mehr kompilieren.

    C:\PGVerwaltung2-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\PGVerwaltung2\mainwindow.cpp:44: Fehler:request for member 'show' in '((MainWindow*)this)->MainWindow::about', which is of non-class type 'About*'
    

    mainwindow.h:

    #include <QMainWindow>
    #include <QtGui/QApplication>
    #include "about.h"
    
    ...
    
    private:
        Ui::MainWindow *ui;
        About *about;
    

    mainwindow.cpp:

    void MainWindow::on_pbAbout_clicked()
    {
        this->about.show();
    }
    

    Und was mache ich nun mit dem delete this? Einfach durch this->about.hide() ersetzen?

    Gruß

    E: Hier noch der Konstruktor von MainWindow:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->ui->tblGroups->setColumnWidth(2, 300);
        this->about = new About();
    }
    


  • Ein About-Fenster ist üblicherweise ein About-Dialog - er wird kurz angezeigt und wieder weggeklickt. Deshalb About von QDialog ableiten. In der Methode kannst du dann problemlos das schreiben:

    void MainWindow::on_pbAbout_clicked()
    {
        About about;
        about.exec();
    }
    

    Doku QDialog::exec()!
    Da ein About-Dialog so was von allgegenwärtig ist, gibt es schon was passendes in Qt:
    http://qt-project.org/doc/qt-4.8/qmessagebox.html#about

    (Dass dein Aufruf nicht mehr geklappt hat lag daran, dass du einen Pointer erst dereferenzieren musst bzw. direkt per "->" darauf zugreifst. Sollte dich aber für dieses Problem nicht mehr interessieren)



  • Wie kann ich mein GUI für diesen Dialog übernehmen? Ich meine, das Fenster ist im Prinzip fertig, möchte nicht alles über den Haufen werfen. Was genau meinst du mit dereferenzieren?



  • Karottenkopf51 schrieb:

    Wie kann ich mein GUI für diesen Dialog übernehmen? Ich meine, das Fenster ist im Prinzip fertig, möchte nicht alles über den Haufen werfen. Was genau meinst du mit dereferenzieren?

    http://www.mi.uni-koeln.de/c/mirror/f7alpha1.informatik.fh-muenchen.de/~schieder/c-c++-workshop-ws98-99/slide0109.html



  • Okay, also bekomme ich durch das dereferenzieren (&) den Pointer durch das Objekt? Aber das hilft mir noch nicht so wirklich für das Umsetzen der Lösung meines Problems. Habe nochmal alles rausgelöscht. An folgende Vorgehensweise habe ich gedacht:

    1. In der mainwindow.h about.h inkludieren:

    #include "about.h"
    

    2. In der mainwindow.h About als private deklarieren:

    private:
        Ui::MainWindow *ui;
        About *about;
    

    (Nebenfrage: Kann ich About nicht auch statisch deklarieren? In diesem Falle wird es ja nicht außerhalb vom MainWindow benötigt, oder übersehe ich da etwas fatales?)

    3. Im MainWindow Konstruktor wird das Objekt About initialsiert, damit man später lediglich mit hide() und show() arbeiten kann.

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->about = new About();
    }
    

    Hier fängts allerdings schon an. Muss ich this->about jetzt mit einem & ansprechen?

    &(this->about) = new About();
    

    Das funktioniert auch nicht wirklich, erhalte dann folgendes: C:\PGVerwaltung2-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\..\PGVerwaltung2\mainwindow.cpp:10: Fehler:lvalue required as left operand of assignment

    Entschuldigt, dass ich mich so blöd anstelle.



  • Das ist zwar nen C-Tutorial, aber es ist das gleiche Konzept/Syntax:
    http://www.tutorials.at/c/11-zeiger.html

    this->about = new About();
    

    Das ist schon richtig so.
    Das mit dem derenfenzieren war auf den Zeiger bezogen:

    //Falsch:
    this->about.show(); 
    
    // Richtig:
    this->about->show();
    

    Kann ich About nicht auch statisch deklarieren? In diesem Falle wird es ja nicht außerhalb vom MainWindow benötigt, oder übersehe ich da etwas fatales?

    Ja. Das Objekt wird dann beim Start des Programms "irgendwann" angelegt und existiert die ganze Zeit. Nicht so optimal. Ausserdem ist es schlechter Stil. Vermeide static als Klassenmitglied wenn es geht.


Anmelden zum Antworten