Wie beende ich QMediaPlayer Instanzen oder grundsätzlich Qt-Objekte welche mit new erstellt wurden?

Alles rund um die Programmierung mit Qt
Antworten
udoB
Beiträge: 1
Registriert: 29. Dezember 2024 03:43

Wie beende ich QMediaPlayer Instanzen oder grundsätzlich Qt-Objekte welche mit new erstellt wurden?

Beitrag von udoB »

Hallo,

ich habe mit dem Qt-Designer folgenden kleinen Dialog als Testobjekt für den QMediaPlayer erstellt:

mediaplayer_example.ui

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>QMediaPlayer_Example</class>
 <widget class="QDialog" name="QMediaPlayer_Example">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>915</width>
    <height>488</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>QMediaPlayer_Example</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0" colspan="5">
	<widget class="QVideoWidget" name="videoWidget">
	<property name="styleSheet">
		<string>background-color: black;</string>
		<!-- der Hintergrund wird auf schwarz gesetzt, damit man Größenänderungen -->
		<!-- des darin eingebetteten Videos nicht sieht -->
	</property>
	</widget>
   </item>
   <item row="1" column="0">
    <spacer name="horizontalSpacer">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>311</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="1">
    <widget class="QPushButton" name="playButton">
     <property name="text">
      <string>Play</string>
     </property>
    </widget>
   </item>
   <item row="1" column="2">
    <spacer name="horizontalSpacer_2">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeType">
      <enum>QSizePolicy::Fixed</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>80</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="3">
    <widget class="QPushButton" name="stopButton">
     <property name="text">
      <string>Stop</string>
     </property>
    </widget>
   </item>
   <item row="1" column="4">
    <spacer name="horizontalSpacer_3">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>311</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>
Und dazu die passenden Dateien:

main.cpp

Code: Alles auswählen

# include <QApplication>

# include "mediaplayer_example.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QMediaPlayer_Example *dialog = new QMediaPlayer_Example; // Name des Dialogfeldes
	dialog->show();
	return app.exec();
}
mediaplayer_example.h

Code: Alles auswählen

# ifndef MEDIAPLAYER_H
# define MEDIAPLAYER_H

# include <QDialog>
# include <QMediaPlayer>
# include <QVideoWidget>

# include "ui_mediaplayer_example.h"

class QMediaPlayer_Example : public QDialog, public Ui::QMediaPlayer_Example
{
	Q_OBJECT

public:
	QMediaPlayer_Example(QWidget *parent = 0);

private slots:
	void play();
	void stop();

private:
	QMediaPlayer *mediaPlayer;  // Medienplayer-Objekt

};

# endif
mediaplayer_example.cpp

Code: Alles auswählen

# include <QtWidgets>

# include "mediaplayer_example.h"

QMediaPlayer_Example::QMediaPlayer_Example(QWidget *parent): QDialog(parent)
{
	setupUi(this);

	// QMediaPlayer initialisieren
	mediaPlayer = new QMediaPlayer(this);

	// QMediaPlayer mit QVideoWidget verbinden
	mediaPlayer.setVideoOutput(videoWidget);

	connect(playButton, SIGNAL(clicked()), this, SLOT(play()));
	connect(stopButton, SIGNAL(clicked()), this, SLOT(stop()));

}

void QMediaPlayer_Example::play()
{
	// Video abspielen
	mediaPlayer->setMedia(QUrl::fromLocalFile("/home/udo/Testfile.mp4"));  // Lokale Videodatei
	mediaPlayer->play();
}

void QMediaPlayer_Example::stop()
{
	// Wiedergabe stoppen
	mediaPlayer->stop();
}
mediaplayer_example.pro

Code: Alles auswählen

TEMPLATE = app
TARGET = QMediaPlayer_Example
# HINWEIS: DEPENDPATH war bei der früheren Version Qt4 dabei und wird bei Qt5 nicht mehr generiert
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += mediaplayer_example.h
FORMS += mediaplayer_example.ui
SOURCES += main.cpp mediaplayer_example.cpp

QT += widgets
QT += multimedia
QT += multimediawidgets
Erstelle ich das Qt-Programm mittels

Code: Alles auswählen

$ qmake; make
auf der Konsole unter Linux, läuft das Programm ohne Probleme und spielt das Video ab. Jetzt habe ich aber folgendes Problem und damit eine grundsätzliche Frage zu Qt und meiner Vorgehensweise mit dem Qt-Designer Qt-Programme zu erstellen:

Wenn ich ein anderes Programm erstelle, in dem es einen Button gibt, welcher einen Dialog öffnet der den hier gezeigten QMediaPlayer Code enthält, dann stürzt das Programm nach dem Schließen des Dialogs und erneutem Öffnen durch Drücken auf den Button ab. Ich vermute mal, weil beim Schließen des Extra-Dialogs die Instanz

Code: Alles auswählen

mediaPlayer = new QMediaPlayer(this);
nicht richtig geschlossen wird.

Soweit ich das verstanden habe, übernimmt der Qt-Designer das Zerstören aller von ihm erstellten Qt-Objekte und man muß sich nicht darum kümmern. Wenn ich aber in meinem Code mit new ein Objekt erstelle, muß ich wohl selber Sorge dafür tragen, daß es korrekt zerstört wird, wenn ein zusätzlicher Dialog geschlossen wird. Nun meine grundsätzliche Frage: Bei meiner Vorgehensweise mit der Hilfe des Qt-Designers, wo zerstöre ich ein Object, das ich mit new erstellt habe? An welcher Stelle baut man so etwas ein?

Natürlich kann ich in diesem Beispiel das Objekt auch statisch definieren mit

Code: Alles auswählen

QMediaPlayer mediaPlayer;
und die Methoden auf mediaPlayer.play(); stellen, dann stürzt das Programm nicht mehr ab. Aber mich hätte das mal grundsätzlich interessiert, falls ich tatsächlich mal dynamisch Objekte in einem Qt-Programm erstellen und wieder zerstören muß.

Schon mal vielen Dank falls jemand meinen langen Post gelesen hat und mir antwortet!
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Wie beende ich QMediaPlayer Instanzen oder grundsätzlich Qt-Objekte welche mit new erstellt wurden?

Beitrag von veeman »

Der Qt-Designer zerstört da gar nichts. Wenn dann tut es die Objekthierarchie von QObject.

Wenn du dein MediaPlayer Objekt mit

Code: Alles auswählen

new QMediaPlayer(this);
erstellst, dann wird das Objekt an this als Kind angehängt.
Wenn das Fenster geschlossen wird, dann wird es (normalerweiße) zerstört und in diesem Zuge werden alle Kind-Objekte zerstört.

Wenn dein Programm abstürzt weil du eine zweite Instanz von deinem Dialog erstellst, dann hat es einen anderen Grund.
Antworten