2011-03-02 2 views
1

QDialog를 주 윈도우로 사용하는 응용 프로그램을 작성하고 있습니다. 이 응용 프로그램에서 나는 3 개의 QGroupBox, 하나는 여러 버튼, 하나는 GLWidget (캡처 및 OpenCV를 사용하여 처리 및 OpenGL과 함께 표시) GLWidget와 함께, 그리고 세 번째 하나는 Phonon을 사용하여 다른 비디오를 재생하려고했는데 (기본적으로 이 문제는 내 문제와 관련이 없지만 QComboBox를 사용하여 비디오를 선택하려고합니다.)QDialog의 Phonon :: VideoWidget 문제

GUI가 초기화되어 필요한 모든 작업을 수행합니다 ... 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). 

진실은이 문제에 대해 조금 혼란스러워합니다. 그것은 내가 그 구성 요소로 VideoWidget을 생성 할 QWidget을 작성하는 동안 발생합니다 ... 다른 Phonon 클래스를 검사했고 GUI가 초기화 될 때 영향을받지 않습니다. 예 :

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

는 또한 간단한 GUI로 문제를 재현하는 시도, 그것은 컴파일하고 문제없이 작동하므로 포논과 충돌 무언가가 있어야한다. 나는 그것이 GLWidget이 될 수 있다고 생각했지만 GUI의이 부분을 연결 해제했다 ... 그리고 그것은 여전히 ​​스레드를 죽인다.

누군가 비슷한 문제가 발생 했습니까? 누군가가 잘못 될 수 있거나 스레드가 죽는 것을 확인하는 방법에 대한 통찰력이 있습니까?

+0

포논 경로를 만들었습니까? –

+0

안녕 카밀, 안돼. 내가 줄을 포함 할 때 : Phonon :: VideoWidget * _player_video = new Phonon :: VideoWidget; 이 줄 바로 뒤에 모든 QT 스레드가 코드 1로 종료됩니다. 추신 : Phonon :: createPath 메서드에 대해 이야기하고 있다고 가정 해 보겠습니다. – sergi

답변

0

QDialog가 이러한 문제를 일으키는 이유라고 생각합니다.

+0

문제의 원인을 찾을 수 없지만 QDialog가 아닙니다. 내가 코드를 복사 (대부분의 그것을 붙여 넣기) 및 QDialog에서 잘 작동합니다. 추신 : 비디오 대신 투명한 위젯을 표시했다는 것을 추가해야하며 videoWidget을 작동 시키려면 Qt 버전을 4.7.2로 업데이트해야했습니다. – sergi

0
#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

그것은 나를 위해 작동합니다. –