QT Alle fenster Aufrufbar und Globales Schließen



  • Hallo,
    ich möchte Folgendes erreichen:
    1. Es sollen alle Fenster geschlossen werden, wenn ein Bestimmtes Fenster geschlossen wird.
    2. Es soll möglich sein, gleichzeitig mehrere Fenster zu bearbeiten.

    ich habe hierfür mal einen Testquellcode:

    #include <QApplication>
    #include <qmessagebox.h>
    #include <qwidget.h>
    
    class mein_exit : public QMessageBox {
    public:
    	mein_exit(void(*fp)()) : QMessageBox(){ //fp zeiger auf Funtion
    		alles_schliessen = fp;
    	}
    
    	~mein_exit() {
    		alles_schliessen();
    	}
    
    private:
    	void(*alles_schliessen)();
    
    };
    
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    
    	QMessageBox test;
    	test.setText("HALLO");
    	test.show();
    
    	mein_exit exit_window(QApplication::closeAllWindows);
    	exit_window.show();
    	exit_window.setText("ALLES SCHLIESSEN");
    	exit_window.move(QPoint(10, 20));
    
    	return a.exec();
    }
    

    Sobald das Fenster "ALLEES SCHLIESSEN" geschlossen wird, soll sich auch das Fenster "HALLO" schließen (nicht umgekehrt).
    Es soll möglich sein beide Fenster unabhänig voneinander zu schließen(zu bearbeiten).

    Für hilfe wäre ich sehr dankbar.



  • Deine Code ist recht wirr. Jedenfalls kannst du mit QApplication::topLevelWidgets alle Top Level Widgets holen, sie durchgehen, und schauen, ob du das schließen willst oder nicht.



  • Mechanics schrieb:

    Deine Code ist recht wirr. Jedenfalls kannst du mit QApplication::topLevelWidgets alle Top Level Widgets holen, sie durchgehen, und schauen, ob du das schließen willst oder nicht.

    Wie genau macht man das?

    Und eine weiterer Frage: Wann genau wird eigentlich der Destuktor Aufgerufen?
    Ich dachte er wird dann für ein Fenster aufgefufen, wenn diese Geschlossen wird.

    #include <QApplication>
    #include <qmessagebox.h>
    #include <qwidget.h>
    #include <Windows.h>
    
    	class mein_exit : public QMessageBox {
    public:
    	mein_exit(void(*fp)()) : QMessageBox(){ //fp zeiger auf Funtion
    		alles_schliessen = fp;
    	}
    	~mein_exit() {
    		alles_schliessen();
    	}
    private:
    	void(*alles_schliessen)();
    
    }; //ende mein_exit
    
    void teste_destuktor() {
    	QMessageBox temp;
    	Sleep(10000);
    
    }
    
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    
    	QMessageBox test;
    	test.setText("HALLO");
    	test.show();
    
    	mein_exit exit_window(teste_destuktor);
    	exit_window.show();
    	exit_window.setText("ALLES SCHLIESSEN");
    	exit_window.move(QPoint(10, 20));
    
    	return a.exec();
    }
    

    Also sollte eigentlich ein Fenster erzeut werden, wenn das Fester "ALLES SCHLIESSEN" geschlossen wird. Das Fenster wird aber erst erzeugt, wenn beide Fenster geschlossen werden. Warum?



  • win8789 schrieb:

    Wie genau macht man das?

    Irgendwie so:

    QWidgetList widgets = QApplication::topLevelWidgets();
    foreach (QWidget * widget, widgets) {
      if (widget()->objectName() == "bla")
        widget->close();
    }
    

    Oder was auch immer dein Kriterium ist.

    Das ist normales C++, da gibts keine Sonderregeln für Destruktoren. Deine Stackobjekte werden gelöscht, wenn der Scope verlassen wird, und nicht, wenn das Fenster geschlossen wird.
    Du musst nur zusätzlich beachten, dass ein QObject im Destruktor seine Kinder löscht. Oder du kannst einem Widget auch ein Flag WADeleteOnClose oder so mitgeben, dann wirds auch gelöscht.



  • danke es funktioniert jetzt.
    Nun muss ich es nur noch hinbekommen, dass man alle Fenster unabhängig bearbeiten kann. Momentan muss man ja das eine Fenster schließen um das anderer zu bearbeiten.



  • win8789 schrieb:

    Momentan muss man ja das eine Fenster schließen um das anderer zu bearbeiten.

    Dann ist das Fenster modal.
    Siehe: http://doc.qt.io/qt-4.8/qdialog.html#modal-prop



  • jb schrieb:

    win8789 schrieb:

    Momentan muss man ja das eine Fenster schließen um das anderer zu bearbeiten.

    Dann ist das Fenster modal.
    Siehe: http://doc.qt.io/qt-4.8/qdialog.html#modal-prop

    danke an euch. Funktioniert nun alles 👍


Log in to reply