如何在GUI中通过按钮或键盘使QProcess停止



这里我想用ffmpeg.exe制作一个记录器。

并且,我找到了推荐行,成功运行并生成了视频文件。我知道按键盘上的"Esc"或"q"可以结束

现在,我想使用GUI来控制编码器(ffmpeg.exe)。我在这里选择Qt,我的工作环境是windows 7 sp1。

我使用QProcess来执行它,您将看到以下内容:

但是我不知道如何结束这个过程。

代码列表:Main.cpp很简单

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    QProcess *pro;
    QString recorder;
    QString outputName;
    QString options;
private slots:
    void startRecode();
    void stopRecode();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QProcess>
#include <QTest>
#include <QPushButton>
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    pro(new QProcess)
{
    QDateTime current_date_time = QDateTime::currentDateTime();
    QString current_date = current_date_time.toString("yyyy-MM-dd-hh_mm_ss");
    recorder = "E:\bin\ffmpeg.exe";
    outputName = current_date + ".mp4";
    options = "-f gdigrab -framerate 6 -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -hide_banner -report";
    //-t 00:00:05"; this option can limit the process running time, and work well no GUI, but I don't want to use given time to stop recording.
    QWidget *centerWindow = new QWidget;
    setCentralWidget(centerWindow);
    QVBoxLayout *mainLayout = new QVBoxLayout;
    QPushButton *startButton = new QPushButton("start recording");
    QPushButton *stopButton = new QPushButton("stop recording");
    mainLayout->addWidget(startButton);
    mainLayout->addWidget(stopButton);
    centerWindow->setLayout(mainLayout);
    connect(startButton, SIGNAL(clicked()), this, SLOT(startRecode()));
    connect(stopButton, SIGNAL(clicked()), this, SLOT(stopRecode()));
}
MainWindow::~MainWindow()
{
    delete pro;
}
void MainWindow::startRecode()
{
    pro->execute(QString(recorder + " " +options +" " + outputName));
}
void MainWindow::stopRecode(){
    pro->terminate(); // not work
    //pro->close(); // not work, too
    //pro->kill(); // not work, T_T
    //how to terminate the process by pushbutton??
}

有什么好主意吗?

或者,我的录音机有其他解决方案吗?

我可以正常运行:

#include <QTimer>
#include <signal.h>
[...]
int thisPid = pro->pid();
kill(thisPid, SIGINT);
QTimer::singleShot( 2000, pro, SLOT( tryTerminate() ) );
QTimer::singleShot( 5000, pro, SLOT( kill() ) );

这将首先获得进程的进程id,然后

  1. 发送中断信号到进程(如果你是在windows下,你需要适应这部分)
  2. 连接一个单次定时器,在2秒后执行tryTerminate
  3. 连接一个一次性定时器,在5秒后执行kill

如果有帮助请告诉我

相关内容

  • 没有找到相关文章

最新更新