Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法

Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法

Qt中执行终端命令和执行shell脚本文件是一个常见需求,一般可以在c++中直接调用system()实现执行终端命令,shell脚本同样也可以,但是会阻塞程序。实际上更推荐使用Qt中提供的QProcess,高度封装好的功能,拥有非阻塞的优点。

但是我在网上看了很多博客,内容大多数互相转载搬运甚至抄袭,如果跟着大多数博客去使用QProcess的话,分分钟踩坑和浪费时间调试。


常见踩坑,见到避开

很多方法都是教人这么用QProcess,基本会程序阻塞,而且得不到想要的输出结果。

 	QProcess process;
    process.start(bash);
    process.write("hello.sh");
    process.waitForFinished();		//或者用waitForStarted()函数
    QByteArray output = process.readAllStandardOutput();
    qDebug()<<output;
    ui->paintText->appendPlainText(output);

看到这种直接使用waitForFinished的或者waitForStarted函数的方法的,请及时避雷。

有的方法会使用lambda去写connect连接信号和槽,同样不好用,不是标准的使用方法。


QProcess标准使用方法就是老老实实连接信号与槽

想真正非阻塞地使用QProcess,老老实实按照连接信号与槽的方法去使用。下面介绍标准使用流程:

  1. 首先在MainWindow类里创建QProcess;
class MainWindow : public QMainWindow
{
	public:
		...
	private:
		QProcess* process;		//创建私有Qprocess变量,供MainWindow内部调用
}
  1. 并且记得在构造函数中new QPrcess;
MainWindow::MainWindow
{
	...
	process = new QProcess();
	...
}
  1. 在MainWindow中声明槽函数;
class MainWindow : public QMainWindow
{
	public:
		...
	public slots:
		void processOuptutSlot();
	private:
		...
}
  1. 实现槽函数(想要执行命令后有什么功能就在此实现);
void MainWindow::processOuptutSlot()
{
	//输出终端信息
	qDebug()<<process->readAllStandardOutput();
}
  1. 在构造函数中连接信号与槽
MainWindow::MainWindow
{
	...
	//readyReadStandardOutput是QProcess提供的信息,具体查阅QT助手
	QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutputSlot()));
	...
}
  1. 使用QProcess然后触发readyReadStandardOutput信号
//通常在某个按钮的槽函数或者某个函数中调用process执行命令
{
	...
	process->start("bash");
    process->write("./home/hello.sh\n");	//使用sh脚本的路径,结尾必须加上\n,代表回车
    //或者尝试使用别的命令
    //prcess->write("ls\n");
}

只要命令有输出,就会不断激活readyReadStandardOutput信号(通常不止一次),然后执行槽函数输出信息,输出信息完结了就不会激活readyReadStandardOutput信号了。整个过程非阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值