播放器全屏 音量 时间进度都已经实现,追加快捷键设计...
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.yyelse 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.yelse 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 filenameargs << 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 basemplayerProcess->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 classreturn 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();
}