Наконец-то я решил свою проблему и решил поделиться своим решением со всеми остальными. В конструкторе класса я инициализирую следующие две переменные:
media = new Phonon::MediaObject(this);
videoWidget = new Phonon::VideoWidget;
Я подключаю сигнал media
к слоту в моем классе:
connect(media,SIGNAL(stateChanged(Phonon::State,Phonon::State)),
this,SLOT(videoState(Phonon::State,Phonon::State)));
Я позволяю пользователю выбрать видеофайл:
QString filename = QFileDialog::getOpenFileName(this,tr("Choose video file"),QDir().homePath(),tr("Video files (*.mov *.mpg *.avi)"));
И применим этот файл к объекту media
:
media->setCurrentSource(filename);
Phonon::createPath(media,videoWidget);
Поскольку объект media
уже подключен к слоту, каждое изменение в media
можно отслеживать с его помощью.
void VideoModuleDialog::videoState(Phonon::State newState, Phonon::State oldState)
{
if(newState == Phonon::PlayingState || newState == Phonon::StoppedState)
{
width->setText(QString().number(videoWidget->sizeHint().width()));
height->setText(QString().number(videoWidget->sizeHint().height()));
}
if(newState == Phonon::ErrorState)
{
QMessageBox::critical(this,tr("Video file error!"),
tr("Video file error: ") + media->errorString(),QMessageBox::Ok);
}
}
Однако я должен признать, что этот код кажется мне довольно медленным. Библиотека Phonon используется в моей программе только в одном месте, и это здесь, в диалоговом окне, где пользователь может выбрать видеоклип для встраивания, и я хочу, чтобы размеры видео считывались из файла. Это диалоговое окно откроется через некоторое время, поэтому я думаю, что это решение слишком жесткое для моей проблемы. Однако другого решения я не нашел. Если есть разные мнения по поводу темы этого поста, буду рад их услышать.
person
Pavlo Dyban
schedule
02.05.2011