QT实战教程:
- QT初步之计时器
- QT信号与槽
- QT多线程实战
- QT文件读写
文章目录
调用系统指令
针对类似复制、移动等功能,显然操作系统提供了更加完备的指令。QT
提供了QProcess
类,用于调用系统指令,就像C语言中的system
一样。
例如,在Windows
中也提供了复制命令copy
,那么拖动一个按钮,改名为btnCopyFile
,然后转到槽,添加click
动作
void MainWindow::on_btnCopyFile_clicked()
{
QString oldName = QFileDialog::getOpenFileName(this,"请选择文件");
QString newName = QFileDialog::getSaveFileName(this,"请输入文件名");
QProcess cpPro(this);
QString code = "copy";
ui->txtContent->setText(code);
QStringList para;
para << oldName << newName;
foreach(QString item, para)
ui->txtContent->append(item);
cpPro.start(code, para);
}
其中,cpPro
就是一个QProcess,最终调用时用到cpPro.start(code,para)
,其中code
是准备执行的指令,格式为QString
;para
是指令列表,类型为QStringList
,也就是QList<QString>
。
效果为
系统指令返回值
QProcess
的强大之处在于,不仅可以执行系统的命令行指令,还能捕获命令行的返回值。以ls
命令为例(当然,Windows自身是没有ls的,可用dir)
其效果为
代码为
void MainWindow::on_btnListFiles_clicked()
{
QString folder = QFileDialog::getExistingDirectory(this,"请选择文件夹");
ui->lineTitle->setText(folder);
QProcess cmd;
cmd.start("dir",QStringList()<<folder);
cmd.waitForStarted();
cmd.waitForFinished();
ui->txtContent->append(cmd.readAllStandardOutput());
}
和之前的代码相比,增加了两个wait
,一个read
,顾名思义,前者分别用于等待命令开启和完成,后者用于获取命令行的标准输出。
这里涉及到QProcess的生命周期:
waitForStarted()
:阻塞,直到外部程序启waitForReadyRead()
:阻塞,直到输出通道中的新数据可读waitForBytesWritten()
:阻塞,直到输入通道中的数据被写入waitForFinished()
:阻塞,直到外部程序结束