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; make
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);
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!