一、要点
(1)创建一个Widget主窗体,名为test的类。QLabel作为播放框,QListWidget作为播放列表。一个暂停按钮。暂时没懂修改,无法实现进度条进度。只是实现了双击列表,循环播放视频,或者点击按钮,暂停/继续播放视频。
(2)在有关路径的语句中,如果要用相对路径,一定要注意把这里的√去掉,否则工作目录和文件目录不在一个文件,比较难找。如果勾选了Shadow Build,则构建过程中生成的中间文件和输出文件(工作目录)将默认存储在一个与源代码目录不同的位置。把√去掉的话,就可以用“./......”这种方式找到图片或视频文件。可以用以下语句打印出当前工作目录路径:
QString currentPath = QDir::currentPath();
qDebug()<<currentPath;
(3)给播放器发送暂停/播放指令时,我把换行符写反了。
player->write("pause\n");能实现立马暂停
player->write("pause/n");过几秒才暂停
以下是GPT的解释:
第一句代码中,使用的是"\n"作为换行符,它会立即执行换行操作,然后执行暂停操作。第二句代码中,使用的是"/n"作为换行符,是一个无效的换行符,它不会立即执行换行操作,而是等待一段时间才会执行换行操作,然后再执行暂停操作。因此,导致了这两句代码的执行结果有区别。
还可以在发送指令之后加以下这句,保证命令被立即发送。
player->waitForBytesWritten();
二、代码
test.h
#ifndef TEST_H
#define TEST_H
#include <QWidget>
#include <QProcess>
#include <QListWidget>
#include <QListWidgetItem>
#include <QDir>
namespace Ui {
class test;
}
class test : public QWidget
{
Q_OBJECT
public:
explicit test(QWidget *parent = 0);
~test();
private slots:
void on_vid_list_doubleClicked(const QModelIndex &index);
void on_pause_bt_clicked();
private:
Ui::test *ui;
QProcess *player;
};
#endif // TEST_H
test.cpp
#include "test.h"
#include "ui_test.h"
#include <QDebug>
test::test(QWidget *parent) :
QWidget(parent),
ui(new Ui::test)
{
ui->setupUi(this);
//QDir dir("/opt/xiaoyi/test/test/video/");
QDir dir("./video/");
if(!dir.exists())
return;
QStringList list,filters;
filters<<"*.avi"<<"*.mp4";
list = dir.entryList(filters);
ui->vid_list->addItems(list);
QIcon icon(":/new/prefix1/icon/video.png");
for(int i = 0; i < list.size();i++)
{
ui->vid_list->item(i)->setIcon(icon);
}
player = new QProcess();
}
test::~test()
{
delete ui;
}
void test::on_vid_list_doubleClicked(const QModelIndex &index)
{
if(player->state() == QProcess::Running)
{
player->kill();
player->waitForFinished(3000);
}
//qDebug()<<"index:"<<index.row();
qDebug()<<"name:"<<ui->vid_list->item(index.row())->text();
QString vPathName("./video/"+ui->vid_list->item(index.row())->text());
//QString currentPath = QDir::currentPath();
//qDebug()<<currentPath;
//QString vPathName = currentPath + "/video/" + ui->vid_list->item(index.row())->text();
QStringList list;
list<<"-slave";
list<<"-quiet";
list<<"-wid";
list<<QString::number(ui->show_lb->winId());
list<<"-loop";
list<<"0"; //设置循环播放次数,0表示无限循环
list<<vPathName;
player->start("/usr/bin/mplayer",list);
}
void test::on_pause_bt_clicked()
{
if(player->state() == QProcess::Running)
{
player->write("pause\n");
player->waitForBytesWritten();
}
else
{
player->write("pause\n");
player->waitForBytesWritten();
}
}