Seite 1 von 1

Zusammenspiel zwischen QWidget und QOpenGLWindow.

Verfasst: 17. August 2017 16:06
von FR_Master
Hallo,

folgendes Anliegen: Ich möchte 3D-Inhalte im besagten QOpenGLWindow (Qt 5) visualisieren. Daneben existiert ein QWidget (ebenfalls Window), was quasi zur Anzeige von Statusmeldungen fungiert. Wird das Programm gestartet, soll sich das QWidget öffnen und dem Benutzer die ganze Initialisierung anzeigen. Anschließend öffnet sich das QOpenGLWindow und visualisiert die Szene. Wird das QOpenGLWindow geschlossen, so soll sich auch das QWidget schließen..bzw. das Prg. herunterfahren und beenden. Mein Problem ist, wie ich dieses Zusammenspiel umsetzte. Denn beide Elemente sind ja Toplevel-Fenster. Für jeden Hinweis schon mal im Voraus...Danke.

FR_Master

Re: Zusammenspiel zwischen QWidget und QOpenGLWindow.

Verfasst: 17. August 2017 17:30
von Christian81
Da beide von QObject abegeleitet sind, werden sie beim Zerstören auch beide das Signal destroyed() senden wenn sie zerstört wurden -> http://doc.qt.io/qt-5/qobject.html#destroyed

Re: Zusammenspiel zwischen QWidget und QOpenGLWindow.

Verfasst: 17. August 2017 17:44
von FR_Master
Also sollte ich beide Fenster als unabhängige Fenster umsetzen (in keiner Hierarchie), die wiederum nur über Signal/Slot kommunizieren ?

Re: Zusammenspiel zwischen QWidget und QOpenGLWindow.

Verfasst: 17. August 2017 18:02
von Christian81
Du wolltest wissen wie man ein Fenster zerstört wenn ein anderes zerstört wird. Es hindert Dich aber auch keiner daran, das z.B. beides in einem MainWindow dargestellt wird.

Re: Zusammenspiel zwischen QWidget und QOpenGLWindow.

Verfasst: 18. August 2017 09:12
von odt
Da QWindow kein Signal beim Schliessen anbietet, könntest Du es "von Hand" machen.

Code: Alles auswählen

class TestOpenGLWindow : public QOpenGLWindow {
	Q_OBJECT
public:
	TestOpenGLWindow();
signals:
	void testClosed();
public:
	virtual bool event(QEvent*) override;
};
TestOpenGLWindow::TestOpenGLWindow(){
}
bool TestOpenGLWindow::event( QEvent* event ){
	if( event->type() == QEvent::Close ){
		qDebug() << "close detected";
		emit testClosed();
	}
	return QOpenGLWindow::event( event );
}
int main(int argc, char *argv[]){
	QApplication a(argc, argv);
	QWidget* w = new QWidget();
	w->setWindowTitle( "the widget" );
	w->show();
	TestOpenGLWindow* ow = new TestOpenGLWindow();
	ow->setTitle( "the openglwindow" );
	ow->show();
	QObject::connect( ow, SIGNAL(testClosed()), w, SLOT(close()) );
	return a.exec();
}
Achtung: Ich habe nicht geprüft, ob es Nebenwirkungen gibt, z.B. wenn der "close" von QOpenGLWindow verhindert wird.