Проблема с Phonon :: VideoWidget в QDialog - PullRequest
1 голос
/ 02 марта 2011

Я пишу приложение, используя QDialog в качестве основного окна. В этом приложении у меня есть 3 QGroupBox, один с несколькими кнопками, второй с GLWidget, отображающий контент веб-камеры (захваченный и обработанный с помощью OpenCV и отображенный с OpenGL), а в третьем я пытался воспроизводить различные видео с помощью Phonon (в основном Я намерен выбрать видео с помощью QComboBox, хотя это не относится к моей проблеме).

Все работает, графический интерфейс инициализируется, делает все, что мне нужно ... пока я не попытаюсь создать объект VideoWidget. Это код моего класса:

    GUIT::GUIT(QWidget *parent, Qt::WFlags flags)
    {       

        // Initialization of the different QGroupBox
        createVideo();  
        createButtons();
        createScoreFE();
        createPhonon();

        gbScoreFE->hide();

        QHBoxLayout *layout = new QHBoxLayout;
        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(gbVideo, 0, 0);
        mainLayout->addWidget(gbButtons, 1, 0);
        mainLayout->addWidget(gbScoreFE, 0, 0);

        layout->addLayout(mainLayout);
        layout->addWidget(gbPhonon);

        gbPhonon->hide();   

        this->setLayout(layout);

        layout->setSizeConstraint(QLayout::SetFixedSize);

    }

И метод, который дает сбой:

void GUIT::createPhonon()
{

    gbPhonon = new QGroupBox(tr("Test"));

    // This line makes the program to stop executing.
    Phonon::VideoWidget *_player_video = new Phonon::VideoWidget;

    QVBoxLayout *layout = new QVBoxLayout;

    gbPhonon->setLayout(layout);

}

Как происходит сбой ?? Ну, это просто убивает несколько потоков после создания нового VideoWidget. Это выглядит так:

The thread 'Win32 Thread' (0x12e8) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0x1304) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0xf20) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0xdec) has exited with code 1 (0x1).
The thread 'QThread' (0x1e20) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0x19b0) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0x1f58) has exited with code 1 (0x1).
The thread 'Win32 Thread' (0x1794) has exited with code 1 (0x1).

Правда в том, что я немного запутался в этой проблеме. Он возник во время написания QWidget, где я собирался создать VideoWidget с его компонентами ... Я проверил другие классы Phonon, и GUI не затрагивается при их инициализации. Например:

Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);

Я также пытался воспроизвести проблему с помощью более простого графического интерфейса, и он компилируется и работает без проблем, поэтому должно быть что-то, что находится в конфликте с Phonon. Я думал, что это может быть GLWidget, но я отключил эту часть графического интерфейса ... и он по-прежнему убивает потоки.

Кто-нибудь сталкивался с подобной проблемой? Есть ли у кого-нибудь понимание того, что может пойти не так или как проверить, убивает ли поток?

Ответы [ 2 ]

0 голосов
/ 09 марта 2011
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QVBoxLayout>
#include <QGroupBox>
#include <Phonon>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);

private:
    QGroupBox *gbButtons;
    QGroupBox *gbPhonon;
    QVBoxLayout *mainLayout;
    QPushButton *btnPlay;

    Phonon::AudioOutput *audioOut;
    Phonon::VideoWidget *vWidget;
    Phonon::MediaObject *mObject;

    void createPhonon();
    void createButtons();

private slots:
    void playVideo();
};

#endif // DIALOG_H


#include "dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent)
{
    mainLayout = new QVBoxLayout();
    createButtons();
    createPhonon();

    setLayout(mainLayout);
}

void Dialog::createButtons()
{
    gbButtons = new QGroupBox("Buttons");
    btnPlay = new QPushButton("Play",gbButtons);
    connect(btnPlay,SIGNAL(clicked()),this,SLOT(playVideo()));
    mainLayout->addWidget(gbButtons);
}

void Dialog::createPhonon()
{
    gbPhonon = new QGroupBox("Phonon");

    QVBoxLayout *vLayout = new QVBoxLayout();
    vWidget = new Phonon::VideoWidget;
    mObject = new Phonon::MediaObject;
    audioOut = new Phonon::AudioOutput(Phonon::VideoCategory);

    Phonon::createPath(mObject,vWidget);
    Phonon::createPath(mObject,audioOut);

    vLayout->addWidget(vWidget);
    gbPhonon->setLayout(vLayout);
    mainLayout->addWidget(gbPhonon);

    gbPhonon->hide();
}

void Dialog::playVideo(){

    gbPhonon->show();
    mObject->setCurrentSource(Phonon::MediaSource("C:/Videos/Loving You Tonight.mp4"));
    mObject->play();
}
0 голосов
/ 08 марта 2011

Я думаю, что причиной этой проблемы является QDialog.

...