本文主要是介绍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,老老实实按照连接信号与槽的方法去使用。下面介绍标准使用流程:
- 首先在MainWindow类里创建QProcess;
class MainWindow : public QMainWindow
{public:...private:QProcess* process; //创建私有Qprocess变量,供MainWindow内部调用
}
- 并且记得在构造函数中new QPrcess;
MainWindow::MainWindow
{...process = new QProcess();...
}
- 在MainWindow中声明槽函数;
class MainWindow : public QMainWindow
{public:...public slots:void processOuptutSlot();private:...
}
- 实现槽函数(想要执行命令后有什么功能就在此实现);
void MainWindow::processOuptutSlot()
{//输出终端信息qDebug()<<process->readAllStandardOutput();
}
- 在构造函数中连接信号与槽
MainWindow::MainWindow
{...//readyReadStandardOutput是QProcess提供的信息,具体查阅QT助手QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutputSlot()));...
}
- 使用QProcess然后触发readyReadStandardOutput信号
//通常在某个按钮的槽函数或者某个函数中调用process执行命令
{...process->start("bash");process->write("./home/hello.sh\n"); //使用sh脚本的路径,结尾必须加上\n,代表回车//或者尝试使用别的命令//prcess->write("ls\n");
}
只要命令有输出,就会不断激活readyReadStandardOutput信号(通常不止一次),然后执行槽函数输出信息,输出信息完结了就不会激活readyReadStandardOutput信号了。整个过程非阻塞。
这篇关于Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!