一直没找到理由去学一下QT,由于工作原因之后的工作内容会用到QT,于是这两天摸索了下;早上临时决定先做个视频播放器玩一下,于是先用qml发现不会用,无果,于是放弃了使用qml,等之后系统的看一下JavaScript之后再试试qml吧;今天用的是较为传统的C++加ui文件完成,c++算是我的编程母语,用起来更顺手,做起来相对顺利很多,用示例程序作参考,开始做自己的视频播放器;至于ui文件用不用其实关系不大,控件布局这一块感觉用C++直接做*性更大。
以上是背景,下边开始讲述具体的内容。
简易ui:
全是使用QTdesigner自带的控件,用到四个QPushButton、1个水平QSliderBar、上面空白部分有个QVideoWidget(控件编辑中没有,用代码生成的)。
使用时的状态:
只实现了最简单的打开文件、播放、停止、全屏(其余功能后续有空再做)。。。所以叫简单视频播放器。
代码:
包含了必需组件,槽函数只做了打开、播放、停止、全屏四个。
//头文件
#ifndef MULPLAYER_H
#define MULPLAYER_H #include <QMainWindow>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QMediaPlaylist> namespace Ui {
class MulPlayer;
} class MulPlayer : public QMainWindow
{
Q_OBJECT public:
explicit MulPlayer(QWidget *parent = );
~MulPlayer();
void addToPlaylist(const QStringList& fileNames);
private:
Ui::MulPlayer *ui;
QMediaPlayer *player;
QVideoWidget *videoWidget;
QMediaPlaylist *Playlist;
QString m_fileName;
QMediaPlayer::State m_playerState; private slots:
void openFile();
void playVideo();
void stopVideo();
void fullScr();
}; #endif // MULPLAYER_H
具体实现思路是用QMediaPlayer提供的相关接口取得文件,之后在 QVideoWidget 组件上显示,并用信号与槽机制实现简单的控制流程。下面实现逻辑:
#include "mulplayer.h"
#include "ui_mulplayer.h"
#include <QBoxLayout> MulPlayer::MulPlayer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MulPlayer),
m_playerState(QMediaPlayer::StoppedState)
{
ui->setupUi(this); //MainWindow自带layout,所以需要自定义layout并把它设置成中心layout
//否则将会出现不能设置layout错误
QWidget *widget = new QWidget;
this->setCentralWidget(widget); player = new QMediaPlayer; Playlist = new QMediaPlaylist();
player->setPlaylist(Playlist); videoWidget = new QVideoWidget(widget);
player->setVideoOutput(videoWidget);
ui->progressBar->setRange(, player->duration() / ); //水平布局,控制按钮
QBoxLayout *ctlLayout = new QHBoxLayout;
ctlLayout->addWidget(ui->openFileBtn);
ctlLayout->addWidget(ui->playBtn);
ctlLayout->addWidget(ui->stopBtn);
ctlLayout->addWidget(ui->fullScrBtn); //垂直布局:视频播放器、进度条、控制按钮布局
QBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(videoWidget);
mainLayout->addWidget(ui->progressBar);
mainLayout->addLayout(ctlLayout); //设置布局
widget->setLayout(mainLayout); //信号槽
QObject::connect(ui->openFileBtn,SIGNAL(clicked()),this,SLOT(openFile()));
QObject::connect(ui->playBtn,SIGNAL(clicked()),this,SLOT(playVideo()));
QObject::connect(ui->stopBtn,SIGNAL(clicked()),this,SLOT(stopVideo()));
QObject::connect(ui->fullScrBtn,SIGNAL(clicked()),this,SLOT(fullScr()));
} MulPlayer::~MulPlayer()
{
delete ui;
} void MulPlayer::openFile()
{
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files"));
addToPlaylist(fileNames);
} void MulPlayer::playVideo()
{
m_playerState = QMediaPlayer::PlayingState;
player->play();
} void MulPlayer::stopVideo()
{
m_playerState = QMediaPlayer::StoppedState;
player->stop();
} void MulPlayer::fullScr()
{
if(m_playerState == QMediaPlayer::PlayingState)
{
videoWidget->setFullScreen(true);
}
else
{
videoWidget->setFullScreen(false);
} } void MulPlayer::addToPlaylist(const QStringList& fileNames)
{
foreach (QString const &argument, fileNames) {
QFileInfo fileInfo(argument);
if (fileInfo.exists()) {
QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath());
if (fileInfo.suffix().toLower() == QLatin1String("m3u")) {
Playlist->load(url);
} else
Playlist->addMedia(url);
} else {
QUrl url(argument);
if (url.isValid()) {
Playlist->addMedia(url);
}
}
}
}
下面是main函数,在QT中main的作用相对简单,就是创建APP实例并运行。
#include "mulplayer.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MulPlayer w;
w.show(); return a.exec();
}
以上便是全部代码,非常简洁;当然如果觉得系统UI太丑,想要实现类似于QQ这种界面,就得自己实现一些控件类;QT提供了非常全的各种库,日常使用足够了。
开始了QT的学习,这也算是我整个学习计划中的一环吧,目前为止已研究过uboot、linux系统部分源码、linux模块驱动编程;并且我目前工作的内容是嵌入式应用开发,再加上QT这种偏UI的编程(QT中引入的QML简直就是JavaScript,虽然兴趣不大,如果需要的话还是得学一下),整体上算是嵌入式软件开发的方方面面都涉猎了。
QT-简易视频播放器的更多相关文章
-
C语言基于GTK+Libvlc实现的简易视频播放器(二)
简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...
-
C语言基于GTK+Libvlc实现的简易视频播放器
小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...
-
简易视频播放器2 (基于Qt、opencv)
因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...
-
Qt编写视频播放器(vlc内核)
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...
-
FFmpeg简易播放器的实现-视频播放
本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
-
FFmpeg简易播放器的实现-音视频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
-
FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
-
FFmpeg简易播放器的实现-音频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
-
FFmpeg简易播放器的实现-最简版
本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10040202.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
随机推荐
-
一网打尽当下NoSQL类型、适用场景及使用公司
在过去几年,关系型数据库一直是数据持久化的唯一选择,数据工作者考虑的也只是在这些传统数据库中做筛选,比如SQL Server.Oracle或者是MySQL.甚至是做一些默认的选择,比如使用.NET的一 ...
-
Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)
参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...
-
批量删除Kindle Personal Documents
javascript:(function(){ var v = new RegExp("amazon"); if (!v.test(document.URL)) { return ...
-
android通过服务实现消息推送
这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架 android项目中,有时会有这样一种需求:客户每隔 ...
-
python 模块:csv
转自:http://www.cnblogs.com/sislcb/archive/2008/12/15/1355481.html (感谢整理) 举几个例子来介绍一下,Python 的 CSV模块的使用 ...
-
Mysql数据库异常
1. Mysql数据库异常 1.1. 数据库问题之Got error 28 from storage engine 原因首先检查磁盘是否已满,df -h一下 很可能是日志数据过大,查看该目录下文件夹和 ...
-
js cookie跨域设置
/** * 设置cookie方法 * @param {string} c_name cookie键值 * @param {string} value cookie值 * @param {Boolean ...
-
iOS Swift WisdomHUD 提示界面框架
iOS Swift WisdomHUD 提示界面框架 Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...
-
灵悟礼品网上专卖店——画出E-R图
一.小组成员: 洪雪意(产品负责人) 陈淑筠(Master) 二.组内人员任务情况 计划完成的任务的第三个模块:分析并建立数据库 已完成的任务: 任务的第三个模块: 陈淑筠(完成任务1):画出商品资料 ...
-
Jmeter性能测试使用记录
使用背景 由于最近公司要求对一批接口做性能测试,所以重拾了一些对于Jmeter的使用,现将部分过程做记录,以便以后回溯. 接口参数化 数据参数文件使用了excel保存出的csv文件,dat格式的文件也 ...