Wie beende ich QMediaPlayer Instanzen oder grundsätzlich Qt-Objekte welche mit new erstellt wurden?
Verfasst: 29. Dezember 2024 04:14
Hallo,
ich habe mit dem Qt-Designer folgenden kleinen Dialog als Testobjekt für den QMediaPlayer erstellt:
mediaplayer_example.ui
Und dazu die passenden Dateien:
main.cpp
mediaplayer_example.h
mediaplayer_example.cpp
mediaplayer_example.pro
Erstelle ich das Qt-Programm mittels
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
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
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!
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>
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();
}
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
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();
}
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
Code: Alles auswählen
$ qmake; makeWenn 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);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;
Schon mal vielen Dank falls jemand meinen langen Post gelesen hat und mir antwortet!