1

QDialog をメイン ウィンドウとして使用するアプリケーションを作成しています。このアプリケーションには 3 つの QGroupBox があり、1 つには複数のボタンがあり、2 つ目はウェブカメラ コンテンツを表示する GLWidget があり (OpenCV を使用してキャプチャおよび処理され、OpenGL で表示されます)、3 つ目は Phonon を使用してさまざまなビデオを再生しようとしていました (基本的にはこれは私の問題とは関係ありませんが、QComboBox を使用してビデオを選択するつもりです)。

すべてが機能し、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 を作成しているときに発生します...他のフォノン クラスを確認しましたが、GUI は初期化されても影響を受けません。例えば:

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

また、よりシンプルな GUI で問題を再現しようとしましたが、コンパイルして問題なく動作するため、Phonon と競合するものがあるはずです。GLWidget の可能性があると思いましたが、GUI のこの部分を切断しました ... それでもスレッドが強制終了されます。

誰かが同様の問題に遭遇しましたか?何がうまくいかないのか、またはスレッドのキルを確認する方法について何か洞察がありますか?

4

2 に答える 2

0

QDialogがその問題を引き起こす理由だと思います。

于 2011-03-08T10:03:45.090 に答える
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();
}
于 2011-03-09T05:29:10.893 に答える