本文介绍Qt媒体播放器实现。
Qt应用程序有时会涉及到视频文件的播放,Qt提供了QVideoWidget类实现视频和音频的播放,本文基于QVideoWidget类实现一个简单的媒体播放器。
1.自定义类(基于QVideoWidget类)
由于Qt并未提供专门的控件实现视频的显示,这里需要基于QVideoWidget类自定义一个类,再将拖放的QWidget类提升为自定义的类。这里将其命名为“VideoWidget”类。在使用QVideoWidget类时需在“.pro”文件中添加“multimedia”,“multimediawidgets”,参考代码如下:
QT += core gui \multimedia \multimediawidgets
1)头文件
参考头文件如下:
#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>class VideoWidget : public QVideoWidget
{Q_OBJECT
public:explicit VideoWidget(QWidget *parent = nullptr);~VideoWidget() override;public:void setMediaPlayer(QMediaPlayer *player);protected:void mousePressEvent(QMouseEvent *event) override;void keyPressEvent(QKeyEvent *event) override;signals:private:QMediaPlayer *mediaPlayer;public slots:
};#endif // VIDEOWIDGET_H
2)源文件
参考源文件如下:
#include "videowidget.h"
#include <QEvent>
#include <QKeyEvent>
#include <QMouseEvent>VideoWidget::VideoWidget(QWidget *parent) : QVideoWidget(parent)
{}VideoWidget::~VideoWidget()
{}void VideoWidget::setMediaPlayer(QMediaPlayer *player)
{mediaPlayer = player;
}void VideoWidget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {if (mediaPlayer->state() == QMediaPlayer::PlayingState) {mediaPlayer->pause();} else {mediaPlayer->play();}}QVideoWidget::mousePressEvent(event);
}void VideoWidget::keyPressEvent(QKeyEvent *event)
{if ((event->key() == Qt::Key_Escape) && isFullScreen()) {setFullScreen(false);event->accept();}QVideoWidget::keyPressEvent(event);
}
2.界面设计
界面设计如下图:
其中,
视频显示控件“videoWidget”是拖放了一个QWidget控件,然后将此控件提升为前面自定义的类“VideoWidget”。
3.功能实现
1)头文件
参考头文件如下:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMediaPlayer>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget() override;public slots:void play(void);void stop(void);private:Ui::Widget *ui;private:QMediaPlayer *mediaPlayer;int m_duration;private slots:void mediaStateChanged(QMediaPlayer::State state);void positionChanged(qint64 position);void durationChanged(qint64 duration);void setPosition(int position);void setFullScreen(void);void setVolume(int volume);
};
#endif // WIDGET_H
2)源文件
参考源文件如下:
#include "widget.h"
#include "ui_widget.h"
#include <QStyle>
#include <QMouseEvent>
#include <QTime>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_duration = 0;mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));connect(ui->btnPlay, &QAbstractButton::clicked, this, &Widget::play);connect(ui->btnFullScreen, &QAbstractButton::clicked, this, &Widget::setFullScreen);connect(ui->sldPosition, &QAbstractSlider::sliderMoved, this, &Widget::setPosition);connect(ui->sldVolume, &QAbstractSlider::valueChanged, this, &Widget::setVolume);mediaPlayer->setVideoOutput(ui->videoWidget);ui->videoWidget->setMediaPlayer(mediaPlayer);connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &Widget::mediaStateChanged);connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &Widget::positionChanged);connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &Widget::durationChanged);QString curPath = QCoreApplication::applicationDirPath();mediaPlayer->setMedia(QUrl::fromLocalFile(curPath + "/" + "test.mp4"));ui->sldVolume->setValue(50);mediaPlayer->setPlaybackRate(1.0);
}Widget::~Widget()
{delete ui;
}void Widget::play()
{switch (mediaPlayer->state()) {case (QMediaPlayer::PlayingState): {mediaPlayer->pause();break;}default: {mediaPlayer->play();break;}}
}void Widget::stop()
{mediaPlayer->stop();
}void Widget::mediaStateChanged(QMediaPlayer::State state)
{switch(state) {case (QMediaPlayer::PlayingState): {ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPause));break;}case (QMediaPlayer::StoppedState): {ui->sldPosition->setValue(0);ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));break;}default: {ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));break;}}
}void Widget::positionChanged(qint64 position)
{int temp = 0;temp = static_cast<int>(position);ui->sldPosition->setValue(temp);QString strTime;QTime currentTime((temp / 1000 / 3600) % 60, (temp / 1000 / 60) % 60,temp / 1000 % 60, temp % 1000);QTime totalTime((m_duration / 1000 / 3600) % 60, (m_duration / 1000 / 60) % 60,m_duration / 1000 % 60, m_duration % 1000);QString format = "mm:ss";if (m_duration / 1000 > 3600) {format = "hh:mm:ss";}strTime = currentTime.toString(format) + " / " + totalTime.toString(format);ui->lbTime->setText(strTime);
}void Widget::durationChanged(qint64 duration)
{m_duration = static_cast<int>(duration);ui->sldPosition->setRange(0, m_duration);
}void Widget::setPosition(int position)
{mediaPlayer->setPosition(position);
}void Widget::setFullScreen()
{ui->videoWidget->setFullScreen(true);
}void Widget::setVolume(int volume)
{mediaPlayer->setVolume(volume);
}
其中,
构造函数中媒体播放器绑定了输出控件,输出控件指定了媒体播放器,其他的功能块比较简单,这里不再赘述。
4.效果
运行效果如下:
总结,本文介绍了Qt媒体播放器实现。