Qt中⽤QProcess调⽤cmd命令
项⽬做到⼀定阶段,常常须要在原来的project上调⽤外部程序。
Qt为此提供了QProcess类,QProcess可⽤于完毕启动外部程序,并与之交互通信。
基本⽤法:
QProcess p(0);
p.start("cmd", QStringList()<<"/c"<<"ping www.baidu");
p.waitForStarted();
p.waitForFinished();
QString strTemp=QString::adAllStandardOutput()); //获得输出
// QMessageBox testMassage;
// testMassage.setText(strTemp);
/
/ ();
另⼀种⽤法:
QProcess p(0);
QString command = "E:/test_rar_";
QStringList args;
args.append("a");
args.append("-k");
args.append("-r");
args.append("-s");
args.append("-m1");
args.append("E:/test_rar_course/test.rar");
args.append("E:/test_rar_course/direct1/");
args.append("E:/test_rar_course/direct2/");
args.append("E:/test_rar_");
p.waitForFinished();
qDebug()<<QString::adAllStandardError());
//p.start(command, args);
//p.waitForStarted();
//p.waitForFinished();
注:
QProcess::start() 接受两个参数,第⼀个是要执⾏的命令或者程序,这⾥就是 ;第⼆个是
⼀个 QStringList 类型的数据,也就是需要传递给这个程序的运⾏参数。注意,这个程序是需要能够由系统到的,⼀般是完全路径。
1-不带空格。能够启动
process->start("F:/AppInst/115/");
2-带空格,⽆法启动
process->start("C:/Program Files/");qt进程间通信
3-带空格,使⽤带參模式。能够启动
process->start("C:/Program Files/", QStringList("C:/Program Files/"));
⼀个完整的例⼦
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void openProcess();
void readResult(int exitCode);
private:
QProcess *p;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
p = new QProcess(this);
QPushButton *bt = new QPushButton("execute notepad", this);
connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::openProcess()
{
p->start("", QStringList() << "/c" << "dir");
connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
}
void MainWindow::readResult(int exitCode)
{
if(exitCode == 0) {
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
QString result = gbkCodec->toUnicode(p->readAll());
QMessageBox::information(this, "dir", result);
}
}
在按钮点击的 slot 中,我们通过 QProcess::start() 函数运⾏了指令:
< /c dir
这⾥是说,打开系统的 cmd 程序,然后运⾏ dir 指令。如果有对参数 /c 有疑问,只好去查阅 Windows 的相关⼿册了哦,这已经不是 Qt 的问题了。然后我们 process 的 finished() 信号连接到新增加的 slot 上⾯。这个 signal 有⼀个参数 int。我们知道,对于 C/C++ 程序⽽
⾔,main() 函数总是返回⼀个 int,也就是退出代码,⽤于指⽰程序是否正常退出。这⾥的 int 参数就是这个退出代码。在 slot 中,我们检查退出代码是否是0,⼀般⽽⾔,如果退出代码为0,说明是正常退出。然后把结果显⽰在 QMessageBox 中。怎么做到的呢?原
来,QProcess::readAll() 函数可以读出程序输出内容。我们使⽤这个函数将所有的输出获取之后,由于它的返回结果是 QByteArray 类型,所以再转换成 QString 显⽰出来。另外注意⼀点,中⽂本 Windows 使⽤的是 GBK 编码,⽽ Qt 使⽤的是 Unicode 编码,因此需要做⼀下转换,否则是会出现乱码的,⼤家可以尝试⼀下。
好了,进程间交互就说这么说,通过查看⽂档你可以到如何⽤ QProcess 实现进程过程的监听,或者是令Qt 程序等待这个进程结束后再继续执⾏的函数。
【更多参考】、、、
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论