QT 基于mplayer媒体播放器

 

 

播放器全屏 音量 时间进度都已经实现,追加快捷键设计...

MAINWINDOW.H

 

#ifndef MAINWINDOW_H

#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
#include <QSlider>
#include <QFileDialog>
#include <QDockWidget>
#include <QMenu>
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
  QProcess *mplayerProcess;
  QString filename;
  QTimer *poller;
  QWidget *w;
   QDockWidget *shapesDockWidget1;
   QDockWidget *shapesDockWidget2;
 QTimer *interval;
     QAction *at2;
       QAction *at3;
       QAction *at4;
   QAction *at5;
  QMenu *menu;
  QPoint m_dragPosition;
private slots:
    void on_textEdit_3_textChanged();
    void on_spinBox_editingFinished();
    void on_spinBox_valueChanged(int );
void writeSettings();
void readSettings();
    void on_pushButton_10_clicked();
    void on_pushButton_9_clicked();
    void on_pushButton_6_clicked();
    void on_pushButton_5_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_2_clicked();
    void on_horizontalSlider_2_valueChanged(int value);
    void on_pushButton_8_clicked();
    void on_pushButton_clicked();
    void on_pushButton_7_clicked();
    void on_pushButton_4_clicked();
void timeLineChanged(int pos);
void pollCurrentTime();
void reject();
void enterFullScreen();
void enter();
void closeEvent(QCloseEvent *ex);
void contextMenuEvent(QContextMenuEvent * event);
void mouseMoveEvent(QMouseEvent *event);
          void mousePressEvent(QMouseEvent *event);
          bool eventFilter(QObject *obj, QEvent *ev);
};
#endif // MAINWINDOW_H
 
 MAINWINDOW.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QProcess"
#include <QDockWidget>
#include <QFileDialog>
#include <QVBoxLayout>
#include <QSlider>
#include <QTime>
#include <QTimer>
#include <QDebug>
#include <QPalette>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QApplication>
#include <QDir>
#include <QSettings>
#include <QCloseEvent>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 mplayerProcess = new QProcess(this);
shapesDockWidget1 = new QDockWidget(QString::fromLocal8Bit("播放界面"));
  shapesDockWidget1->setWidget(ui->widget_4);
shapesDockWidget2 = new QDockWidget(QString::fromLocal8Bit("播放时间"));
  shapesDockWidget2->setWidget(ui->widget_2);
//  QWidget *wi = new QWidget(this);
//  wi->resize(400,300);
  addDockWidget(Qt::BottomDockWidgetArea, shapesDockWidget1);
  addDockWidget(Qt::BottomDockWidgetArea, shapesDockWidget2);
shapesDockWidget2->show();
QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->addWidget(ui->widget);
w=new QWidget(this);
w->setLayout(vLayout);
this->setCentralWidget(w);
poller = new QTimer(this);
   interval= new QTimer(this);
connect(interval,SIGNAL(timeout()),this,SLOT(reject()) );
interval->start(1000);
connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(timeLineChanged(int)));
connect(mplayerProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(reject()));
connect(poller, SIGNAL(timeout()), this, SLOT(pollCurrentTime()));
//setWindowOpacity(0.95);
QPalette plt = palette();
  //plt.setColor(QPalette::Background, QColor("Black"));
 plt.setColor(QPalette::Background, QColor("Grey"));
 this->setPalette(plt);
    ui->label_4->setText(QString::fromLocal8Bit("不是全屏"));
    w->setAutoFillBackground(true);
QAction  *at1 = new QAction("进入全屏", this);
   this->addAction(at1);
   this->setAcceptDrops(true);
    at1->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_F)<< QKeySequence(Qt::Key_MediaStop));
   //connect(at1, SIGNAL(triggered()), this,SLOT(enterFullScreen()));
at2 = new QAction(QString::fromLocal8Bit("暂停/开始"), this);
 this->addAction(at2);
 this->setAcceptDrops(true);
 at2->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Space)<< QKeySequence(Qt::Key_MediaStop));
 connect(at2, SIGNAL(triggered()), this,SLOT(enter()));
at3 = new QAction(QString::fromLocal8Bit("全屏"), this);
 this->addAction(at3);
 this->setAcceptDrops(true);
 at3->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_D)<< QKeySequence(Qt::Key_MediaStop));
 connect(at3, SIGNAL(triggered()), ui->pushButton_5,SLOT(click()));
 at4 = new QAction(QString::fromLocal8Bit("退出全屏"), this);
 this->addAction(at4);
 this->setAcceptDrops(true);
 at4->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_S)<< QKeySequence(Qt::Key_MediaStop));
 connect(at4, SIGNAL(triggered()), ui->pushButton_6,SLOT(click()));
at5 = new QAction(QString::fromLocal8Bit("打开"), this);
 this->addAction(at5);
 this->setAcceptDrops(true);
 at5->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_A)<< QKeySequence(Qt::Key_MediaStop));
 connect(at5, SIGNAL(triggered()), ui->pushButton_4,SLOT(click()));
 QAction *at6 = new QAction("前进", this);
 this->addAction(at6);
 this->setAcceptDrops(true);
 at6->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Right)<< QKeySequence(Qt::Key_MediaStop));
 connect(at6, SIGNAL(triggered()), ui->pushButton_9,SLOT(click()));
 QAction *at7 = new QAction("后退", this);
 this->addAction(at7);
 this->setAcceptDrops(true);
 at7->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Left)<< QKeySequence(Qt::Key_MediaStop));
 connect(at7, SIGNAL(triggered()), ui->pushButton_10,SLOT(click()));
 QAction *at8 = new QAction("提高音量", this);
 this->addAction(at8);
 this->setAcceptDrops(true);
 at8->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Up)<< QKeySequence(Qt::Key_MediaStop));
 connect(at8, SIGNAL(triggered()), ui->pushButton_2,SLOT(click()));
  QAction *at9 = new QAction("降低", this);
 this->addAction(at9);
 this->setAcceptDrops(true);
 at9->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Down)<< QKeySequence(Qt::Key_MediaStop));
 connect(at9, SIGNAL(triggered()), ui->pushButton_3,SLOT(click()));
this->readSettings();
 w->installEventFilter(this);
 int x=(QApplication::desktop()->width() - this->width())/2;
 int y=(QApplication::desktop()->height() - this->height())/2;
 this->move (x,y);
this->resize(800,600);
// QDesktopWidget* desktop = QApplication::desktop();
//  int width = desktop->width();
//  int height = desktop->height();
}
void MainWindow::enterFullScreen()
{
    mplayerProcess->write("vo_fullscreen /n");
}
void MainWindow::enter()
{
    if(ui->label_6->text()==QString::fromLocal8Bit("开始"))
        {
                              mplayerProcess->write("pause/n");
                             poller->stop();
                             ui->label_6->setText(QString::fromLocal8Bit("暂停"));
                         }
    else if(ui->label_6->text()==QString::fromLocal8Bit("暂停"))
    {
        mplayerProcess->write("pause/n");
    mplayerProcess->write("get_time_length/n");
    poller->start(10);
    ui->label_6->setText(QString::fromLocal8Bit("开始"));
}
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::pollCurrentTime()
{
        mplayerProcess->write("get_time_pos/n");
       // qDebug()<<ui->label->text();
                //log->append(QString(buffer));
        ui->textEdit->setText(QString::number(ui->horizontalSlider->maximum()/3600)+":"+QString::number((ui->horizontalSlider->maximum()/60)%60)+":"+QString::number(ui->horizontalSlider->maximum()%60));
 ui->textEdit_2->setText(QString::number(ui->horizontalSlider->value()/3600)+":"+QString::number((ui->horizontalSlider->value()/60)%60)+":"+QString::number(ui->horizontalSlider->value()%60));
}
void MainWindow::reject()
{
  this->setFocus();
 // ui->label_5->setText(QString::number(ui->horizontalSlider->maximum()/3600)+":"+QString::number((ui->horizontalSlider->maximum()/60)%60)+":"+QString::number(ui->horizontalSlider->maximum()%60));
//ui->label_5->setText(QString::number(ui->horizontalSlider->value()/3600)+":"+QString::number((ui->horizontalSlider->value()/60)%60)+":"+QString::number(ui->horizontalSlider->value()%60));
    while(mplayerProcess->canReadLine())
    {
            QByteArray buffer(mplayerProcess->readLine());
     ui->textEdit_3->append(QString(buffer));
//qDebug()<<buffer;
            //log->append(QString(buffer));
            // On vérifie si on a eu des réponses
            // réponse à get_video_resolution : ANS_VIDEO_RESOLUTION='<width> x <height>'
            if(buffer.startsWith("ANS_VIDEO_RESOLUTION"))
            {
                    buffer.remove(0, 21); // vire ANS_VIDEO_RESOLUTION=
                    buffer.replace(QByteArray("'"), QByteArray(""));
                    buffer.replace(QByteArray(" "), QByteArray(""));
                    buffer.replace(QByteArray("/n"), QByteArray(""));
                    buffer.replace(QByteArray("/r"), QByteArray(""));
                    int sepIndex = buffer.indexOf('x');
                    int resX = buffer.left(sepIndex).toInt();
                    int resY = buffer.mid(sepIndex+1).toInt();
              ui->widget->setMinimumSize(resX, resY);
            }
            // réponse à get_time_length : ANS_LENGTH=xx.yy
            else if(buffer.startsWith("ANS_LENGTH"))
            {
                    buffer.remove(0, 11); // vire ANS_LENGTH=
                    buffer.replace(QByteArray("'"), QByteArray(""));
                    buffer.replace(QByteArray(" "), QByteArray(""));
                    buffer.replace(QByteArray("/n"), QByteArray(""));
                    buffer.replace(QByteArray("/r"), QByteArray(""));
                    float maxTime = buffer.toFloat();
                    ui->horizontalSlider->setMaximum(static_cast<int>(maxTime+1));
            }
            // réponse à get_time_pos : ANS_TIME_POSITION=xx.y
            else if(buffer.startsWith("ANS_TIME_POSITION"))
            {
                    buffer.remove(0, 18); // vire ANS_TIME_POSITION=
                    buffer.replace(QByteArray("'"), QByteArray(""));
                    buffer.replace(QByteArray(" "), QByteArray(""));
                    buffer.replace(QByteArray("/n"), QByteArray(""));
                    buffer.replace(QByteArray("/r"), QByteArray(""));
                    float currTime = buffer.toFloat();
                    ui->horizontalSlider->setValue(static_cast<int>(currTime+1));
            }
    }
}
void MainWindow::timeLineChanged(int pos)
{
        mplayerProcess->write(QString("seek " + QString::number(pos) + " 2/n").toUtf8());
}
void MainWindow::on_pushButton_4_clicked()
{
filename=QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("文件类型"),".",QString::fromLocal8Bit("文问类型(*.*)"));
if (filename!=NULL)
   {
        poller->stop();
mplayerProcess->close();
     this->setWindowTitle(filename);
              ui->pushButton_7->setEnabled(true);
              mplayerProcess = new QProcess(this);
               QString exefile = QCoreApplication::applicationDirPath()+"/mplayer/mplayer.exe ";
qDebug()<<exefile;
//qDebug()<<QCoreApplication::applicationDirPath();
              QStringList args;
        args << "-slave";
              // Et on veut ne pas avoir trop de chose parser :)
        args << "-zoom";
//args << "-quiet";
   //args << "-xy 1024";
                //args << "-wid" << QString::number(reinterpret_cast<qlonglong>(w->winId()))<<"-x"<<"1680"<<"-y"<<"1050" ;
              args << "-wid" << QString::number(reinterpret_cast<qlonglong>(w->winId())) ;
                               args <<"-vo" << "direct3d";
                        //args <<"-vo" << "gl";
                        //vo=gl
                                        //direct3d
                        //mplayer -fs -zoom -vo fbdev -xy 1024 filename
                            args << filename;
                                       mplayerProcess->setProcessChannelMode(QProcess::MergedChannels);
                                      mplayerProcess->start(exefile,args);
                                      if(!mplayerProcess->waitForStarted(3000))
                                      {
                                              qDebug("allez, cherche le bug :o");
                                      }
                                      // On récupère les infos de base
                                     mplayerProcess->write("get_video_resolution/n");
                                    mplayerProcess->write("get_time_length/n");
                          mplayerProcess->write("get_time_length/n");
                            //mplayerProcess->write("get_time_pos/n");
                             poller->start(10);
                                //mplayerProcess->write("pause/n");
                             ui->label_6->text()=="开始";
                         }
                        }
                        void MainWindow::on_pushButton_7_clicked()
                        {
                            if(ui->label_6->text()==QString::fromLocal8Bit("开始"))
                                {
                                                      mplayerProcess->write("pause/n");
                                                     poller->stop();
                                                     ui->label_6->setText(QString::fromLocal8Bit("暂停"));
                                                 }
                            else if(ui->label_6->text()==QString::fromLocal8Bit("暂停"))
                            {
                                mplayerProcess->write("pause/n");
                            mplayerProcess->write("get_time_length/n");
                                poller->start(10);
                            ui->label_6->setText(QString::fromLocal8Bit("开始"));
                        }
                        }
                        void MainWindow::on_pushButton_clicked()
                        {
                         mplayerProcess->write("vo_fullscreen/n");
                        }
                        void MainWindow::on_pushButton_8_clicked()
                        {
                            QMessageBox::information(this, QString::fromLocal8Bit("About Mdiea Player"),
                                                       QString::fromLocal8Bit("快捷键说明: /n打开:A  /n暂停/开始:space  /n全屏:D /n取消全屏:S /n快进:right /n后退:left /n音量提高:top /n音量降低:down /nID:Jammy  基于mplayer开发 版本0.06"));
                        }
                        void MainWindow::on_horizontalSlider_2_valueChanged(int value)
                        {
                            int i;
                            QString str; QByteArray str1;
                         mplayerProcess->write("volume "+str1+"/n");
                           i=-(40- value); str=QString::number(i);
                            str1=str.toAscii();
                           mplayerProcess->write("volume "+str1+"/n");
                        //qDebug()<<i<<value;
                            }
                        void MainWindow::on_pushButton_2_clicked()
                        {
                              mplayerProcess->write("volume +1/n");
                        }
                        void MainWindow::on_pushButton_3_clicked()
                        {
                               mplayerProcess->write("volume -1/n");
                        }
                        void MainWindow::on_pushButton_5_clicked()
                        {
                           this->setWindowFlags(Qt::Window );
                          w->setWindowFlags(Qt::FramelessWindowHint);
                           this->showFullScreen();
                           shapesDockWidget1->hide();
                            shapesDockWidget2->hide();
                            ui->label_4->setText(QString::fromLocal8Bit("全屏"));
                        }
                        void MainWindow::on_pushButton_6_clicked()
                        {
                           this->setWindowFlags(Qt::Window);
                           this->resize(800,600);
                          // w->setWindowFlags(Qt::FramelessWindowHint);
                         this->showNormal();
                          shapesDockWidget1->show();
                            shapesDockWidget2->show();
                            int x=(QApplication::desktop()->width() - this->width())/2;
                            int y=(QApplication::desktop()->height() - this->height())/2;
                            this->move (x,y);
                            ui->label_4->setText(QString::fromLocal8Bit("不是全屏"));
                        }
                        void MainWindow::on_pushButton_9_clicked()
                        {
                            QString str;
                            str= QString::number(ui->spinBox->value());
                               mplayerProcess->write("seek +"+str.toAscii()+"/n");
                        qDebug()<<str;
                               qDebug()<<"seek +"+str.toAscii()+"/n";
                        }
                        void MainWindow::on_pushButton_10_clicked()
                        {
                            QString str;
                           str= QString::number(ui->spinBox->value());
                            mplayerProcess->write("seek -"+str.toAscii()+"/n");
                        }
                        void MainWindow::on_spinBox_valueChanged(int )
                        {
                        w->setFocus();
                        }
                        void MainWindow::on_spinBox_editingFinished()
                        {
                          w->setFocus();
                        }
                        void MainWindow::closeEvent(QCloseEvent *ex)
                        {
                        //   int a= QMessageBox::information(NULL,QString::fromLocal8Bit("对话框"),QString::fromLocal8Bit("是否需要退出"),QString::fromLocal8Bit("确定"),QString::fromLocal8Bit("取消"),NULL,0,-1);
                        //   if(a==0)
                        //   {
                               writeSettings();
                        //   ex->accept();
                        //   }
                        //   else if(a==1)
                        //   {
                        //   ex->ignore();
                        //   }
                        }
                        void MainWindow::writeSettings()
                        {
                            QSettings settings("Software", "Icon Editor");
                            settings.beginGroup("mainWindow");
                            settings.setValue("size", size());
                            settings.setValue("state", saveState());
                            settings.endGroup();
                        }
                        void MainWindow::readSettings()
                        {
                            QSettings settings("Software", "Icon Editor");
                            settings.beginGroup("mainWindow");
                            resize(settings.value("size").toSize());
                            restoreState(settings.value("state").toByteArray());
                            settings.endGroup();
                        }
                        void MainWindow::contextMenuEvent(QContextMenuEvent *event)
                        {
                            shapesDockWidget1->show();
                              shapesDockWidget2->show();
                        // QCursor cur=this->cursor();
                                 menu=new QMenu(this);
                                menu->addAction(at5);
                               menu->addAction(at2);
                                      menu->addAction(at3);
                                             menu->addAction(at4);
                                //menu->exec(cur.pos());
                                menu->exec(event->globalPos());//
                        //this->setContextMenuPolicy(Qt::ActionsContextMenu);
                        }
                        void MainWindow::mouseMoveEvent(QMouseEvent *event)
                        {
                        //    if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏"))
                        //    {
                        //  if (event->buttons() & Qt::LeftButton  ) {
                        //    move(event->globalPos() - m_dragPosition);
                           move(event->globalPos() - m_dragPosition);
                        //        event->accept();
                        //    }
                        //}
                        }
                        void MainWindow::mousePressEvent(QMouseEvent *event)
                        {
                        //    if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏"))
                        //    {
                        //   if (event->button() == Qt::LeftButton) {
                        //  m_dragPosition = event->globalPos() - frameGeometry().topLeft();
                        //    ui->widget->move(m_dragPosition);
                        //    event->accept();
                        //}
                        //   }
                        }
                        bool MainWindow::eventFilter(QObject *obj, QEvent *event)
                        {
                            if (obj == w) {
                                if (event->type() == QEvent::MouseButtonDblClick)  {
                                   QMouseEvent *ev = static_cast<QMouseEvent *>(event);
                                   if (ev->buttons() & Qt::LeftButton)
                                                 {
                        if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏"))
                                       {
                                       this->setWindowFlags(Qt::Window );
                                      w->setWindowFlags(Qt::FramelessWindowHint);
                                       this->showFullScreen();
                                       shapesDockWidget1->hide();
                                        shapesDockWidget2->hide();
                                         ui->label_4->setText(QString::fromLocal8Bit("全屏"));
                                    }
                        else if(ui->label_4->text()==QString::fromLocal8Bit("全屏"))
                        {
                            this->setWindowFlags(Qt::Window);
                            this->resize(800,600);
                           // w->setWindowFlags(Qt::FramelessWindowHint);
                          this->showNormal();
                           shapesDockWidget1->show();
                             shapesDockWidget2->show();
                             int x=(QApplication::desktop()->width() - this->width())/2;
                             int y=(QApplication::desktop()->height() - this->height())/2;
                             this->move (x,y);
                              ui->label_4->setText(QString::fromLocal8Bit("不是全屏"));
                        }
                        //                                 m_dragPosition = ev->globalPos() - frameGeometry().topLeft();
                        //                                      ev->accept();
                                                     }
                                    return true;
                                }
                                else  if (event->type() == QEvent::MouseButtonPress)  {
                                   QMouseEvent *ev = static_cast<QMouseEvent *>(event);
                                   if (ev->buttons() & Qt::LeftButton)
                                                 {
                        if(ui->label_4->text()==QString::fromLocal8Bit("全屏"))
                                       {
                                     shapesDockWidget1->hide();
                                      shapesDockWidget2->hide();
                                   }
                        else if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏"))
                        {
                            m_dragPosition = ev->globalPos() - frameGeometry().topLeft();
                                                               ev->accept();
w->setFocus();
                        }
                        //                                 m_dragPosition = ev->globalPos() - frameGeometry().topLeft();
                        //                                      ev->accept();
                                                     }
                                    return true;
                                } else if (event->type() == QEvent::MouseMove){
                                    QMouseEvent *ev = static_cast<QMouseEvent *>(event);
                                    if (ev->buttons() & Qt::LeftButton  ) {
                                        if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏"))
                                            {
                                       // move(event->globalPos() - m_dragPosition);
                                   move(ev->globalPos() - m_dragPosition);
                                        ev->accept();
w->setFocus();
                        }
                                    }
                         }
                        else {
                                    return false;
                                }
                                }
                            else {
                                // pass the event on to the parent class
                                return QMainWindow::eventFilter(obj, event);
                            }
                             return true;
                        }
void MainWindow::on_textEdit_3_textChanged()
{
    w->setFocus();
}
 
 
**************************************************
main.cpp
 
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值