2011-03-02 39 views
1

我正在編寫一個使用QDialog作爲主窗口的應用程序。在這個應用程序中,我有3個QGroupBox,一個帶有幾個按鈕,第二個帶有一個顯示網絡攝像頭內容的GLWidget(使用OpenCV捕獲和處理並用OpenGL顯示),第三個我試圖用Phonon播放不同的視頻我打算使用QComboBox選擇視頻,但這與我的問題無關)。聲音:: VideoWidget在QDialog中的問題

一切正常,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). 

事實是,我對這個問題有點困惑。它出現在我寫一個QWidget的時候,在那裏我將創建VideoWidget及其組件...我檢查了其他Phonon類,並且GUI在初始化時不受影響。例如:

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

我也試圖用簡單的GUI來重現問題,並將其編譯和沒有問題的作品,所以應該有一些與聲子發生衝突。我認爲它可能是GLWidget,但我斷開了GUI的這一部分...並且它仍然會殺死線程。

有人遇到過類似的問題嗎?有人對任何可能出錯或如何檢查線程殺死有任何瞭解嗎?

+0

您是否創建了聲子路徑? – 2011-03-02 10:04:14

+0

嗨卡米爾,我不能。當我包括該行: Phonon :: VideoWidget * _player_video = new Phonon :: VideoWidget; 所有QT線程在代碼1之後立即退出。 PS:我想你是在談論Phonon :: createPath方法。 – sergi 2011-03-02 16:48:16

回答

0

我認爲QDialog是造成這個問題的原因。

+0

我無法找到問題的原因,但它不是QDialog。我重寫了代碼(複製並粘貼大部分代碼),並且它在QDialog中正常工作。 PS:我必須補充說它顯示的是一個透明的小部件而不是視頻,我必須將Qt版本更新到4.7.2才能使videoWidget工作。 – sergi 2011-03-09 04:02:52

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

它適合我。 – 2011-03-09 05:29:39