温故知新:
linux中的多进程 fork()
system()/exec函数族
1.常用方法
(1)创建进程对象
QProcess::QProcess(QObject *parent = nullptr)
(2)启动进程去执行另外一个程序
void QProcess::start(const QString &command) //类似于system()/exec函数族
参数:command --》你要执行的另外一个程序的路径名
(3)杀死进程
void QProcess::kill()
(4)等待回收进程
bool QProcess::waitForFinished(int msecs = 30000)
参数:超时时间
(5)获取当前进程的运行状态
QProcess::ProcessState QProcess::state() const
返回值:QProcess::NotRunning --》进程还没有运行
QProcess::Starting --》进程处于就绪态
QProcess::Running --》进程处于执行态 2.举例使用多进程
例子一:创建一个进程,去调用执行window的画图程序,以及计算器程序
例子二:创建进程,使用mplayer播放器去播放视频
windows版本的mplayer播放命令
mplayer绝对路径 -slave -quiet -wid 窗口id号 视频路径
ARM版本的mplayer播放命令
mplayer -slave -quiet -geometry 50:50 -zoom -x 400 -y 350 视频的路径
参数: -geometry --》指定播放的位置坐标
-x 指定视频播放的宽
-y 指定视频播放的高
把彭老师给的ARM版本的mplayer下载到开发板的/bin,然后修改权限为777就可以使用了
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化进程对象
pro=new QProcess(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//播放视频
void MainWindow::on_playbt_clicked()
{
//拼接得到完整的播放命令
QString cmd=QString("C:/mplayer/mplayer.exe -slave -quiet -wid %1 D:/GZ2162文件/GZ2162上课视频/C++/12月9上午讲解构造函数,析构函数.mp4").arg(ui->label->winId());
//通过进程去调用执行mplayer播放视频
pro->start(cmd);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化进程对象
pro=new QProcess(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//启动画图程序
void MainWindow::on_pushButton_clicked()
{
pro->start("mspaint");
}
//启动计算器程序
void MainWindow::on_pushButton_2_clicked()
{
pro->start("calc");
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFileInfo>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化进程对象
pro=new QProcess(this);
//把上课的视频加载到横向列表框中
QDir mydir("D:/GZ2162文件/GZ2162上课视频/C++");
QStringList mylist=mydir.entryList();
for(int i=0; i<mylist.size(); i++)
{
//拼接得到绝对路径
QString allpath=QString("D:/GZ2162文件/GZ2162上课视频/C++/%1").arg(mylist.at(i));
//判断文件是不是mp4或者avi格式的视频
QFileInfo fileinfo(allpath);
QString str=fileinfo.suffix(); //获取文件的后缀名
if(str=="mp4" || str=="avi")
//添加到横向列表框中
ui->listWidget->addItem(allpath);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
//单击列表项
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
videopath=item->text(); //保存了列表项的文本内容
currow=ui->listWidget->currentRow(); //保存了当前列表项的索引
}
//播放视频
void MainWindow::on_playbt_clicked()
{
//拼接得到完整的播放命令
QString cmd=QString("C:/mplayer/mplayer.exe -slave -quiet -wid %1 %2").arg(ui->label->winId()).arg(videopath);
//判断mplayer是不是正在播放其它的视频
if(pro->state()==QProcess::Running) //进程正在运行mplayer播放
{
//杀死
pro->kill();
//顺便回收
pro->waitForFinished();
}
//再去播放目前点击的那个视频
pro->start(cmd);
}
//退出播放
void MainWindow::on_quitbt_clicked()
{
if(pro->state()==QProcess::Running) //进程正在运行mplayer播放
{
//杀死
pro->kill();
//顺便回收
pro->waitForFinished();
}
}
//下一首
void MainWindow::on_nextbt_clicked()
{
if(currow<(ui->listWidget->count()-1))
currow++; //跳到下一首的索引位置
else
currow=0;
//通过这个索引得到下一首的路径名
QString nextstr=ui->listWidget->item(currow)->text();
//拼接得到完整的播放命令
QString cmd=QString("C:/mplayer/mplayer.exe -slave -quiet -wid %1 %2").arg(ui->label->winId()).arg(nextstr);
//判断mplayer是不是正在播放其它的视频
if(pro->state()==QProcess::Running) //进程正在运行mplayer播放
{
//杀死
pro->kill();
//顺便回收
pro->waitForFinished();
}
//再去播放目前点击的那个视频
pro->start(cmd);
//把列表框的当前位置更新
ui->listWidget->setCurrentRow(currow);
}