QProcess 调用cmd命令

1.QProcess

#include <QProcess>

作用:可以用来启动外部程序,并与它们交互。
要启动一个进程,通过调用start()来进行,参数包含程序的名称和命令行参数,参数作为一个QStringList的单个字符串。

QProcess process(this);
    QStringList args;
    args<<"/c"<<"shutdown -s -t "+Time; //其中"/c"不可省略,否则无法解析
    // for(int i=0;i<args.size();i++)
    // {
    //     qDebug()<<args.at(i)<<"";
    // }
    /*void start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite);
    *  @param program:执行外部程序的绝对路径;
    */
    process.start("C:/Windows/System32/cmd.exe",args);
    
    process.waitForStarted(500);
    process.waitForFinished(500);

2.example

#include "widget.h"
#include "ui_widget.h"
#include <string>
#include <iostream>
#include <QMenu>
#include <QDebug>
#include <QProcess>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer=new QTimer(this);
    menu =new QMenu(this);

//    QStyleFactory style;
//    QStringList styles=style.keys();
//    for(int i=0;i<styles.size();i++)
//    {
//        qDebug()<<styles.at(i)<<endl;
//    }

//    QStyle *defualtStyle= style.create(styles.at(2));
//    this->setStyle(defualtStyle);
    this->setStyleSheet(QString("background-color:red"));
    ui->lineEdit->setText("30");
    ui->lcdNumber->setLineWidth(0);
    ui->lineEdit->setPlaceholderText("请输入关机时间(秒)");

    connect(timer,SIGNAL(timeout()),this,SLOT(on_timeout()));

}

Widget::~Widget()
{
    delete ui;
}


void Widget::shutdown()
{
    QString str=ui->lineEdit->text();
    int displaytime=str.toUInt();
    ui->lcdNumber->display(displaytime);
    std::string time=str.toStdString();
    std::string shutdown="shutdown -s -t "+time;
    QString Time=QString::fromLocal8Bit(time.c_str());
    //QString cmd= QString::fromLocal8Bit(shutdown.c_str());
    //qDebug()<<"cmd:"<<cmd<<endl;
    //const char *p=shutdown.c_str();
    QProcess process(this);
    QStringList args;
    if(ui->checkBox->isChecked())
    {
        args<<"/c"<<"shutdown -r -t "+Time;
    }
    else {
        args<<"/c"<<"shutdown -s -t "+Time;
    }
    for(int i=0;i<args.size();i++)
    {
        qDebug()<<args.at(i)<<"";
    }
    process.start("C:/Windows/System32/cmd.exe",args);
    process.waitForStarted(500);
    process.waitForFinished(500);
    //system(p);
    //process.kill();
}

void Widget::on_timeout()
{
    double num=ui->lcdNumber->value();
    num--;
    if(0==num)
    {
        timer->stop();
    }
    QString str_=QString::number(num);
    ui->lcdNumber->display(str_);

}


void Widget::on_pushButton_clicked()
{
    shutdown();
    timer->start(1000);
}

void Widget::on_pushButton_2_clicked()
{
    //system("shutdown -a");
    QProcess process(this);
    QStringList args;
    args<<"/c"<<"shutdown -a";
    process.start("C:/Windows/System32/cmd.exe",args);
    process.waitForStarted(500);
    process.waitForFinished(500);
    //process.kill();
    timer->stop();
    close();
}

3.?

为什么打包后,执行出错?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QProcess是Qt框架提供的一个类,用于启动和执行外部程序。通过QProcess可以执行多条命令。 QProcess的使用相对简单,首先需要创建一个QProcess对象,然后通过调用QProcess的start()方法启动进程。接着可以使用QProcess的write()方法向进程发送待执行的命令,也可以通过setStandardInputFile()方法将一个文件作为输入。 当执行多条命令时,可以使用分号或者换行符作为命令的分隔符。例如,可以通过下面的方式执行两条命令: ```cpp QProcess process; process.start("cmd.exe"); QString commands = "echo Hello; echo World"; process.write(commands.toUtf8()); ``` 上述代码中,我们首先创建了一个QProcess对象,并通过start()方法启动了一个cmd.exe进程。接着通过write()方法向cmd.exe进程发送了命令"echo Hello; echo World"。分号是两条命令的分隔符。 除了使用分号作为命令的分隔符,还可以使用换行符。例如: ```cpp QProcess process; process.start("cmd.exe"); QString commands = "echo Hello\n echo World"; process.write(commands.toUtf8()); ``` 上述代码中,我们将换行符作为命令的分隔符。在向cmd.exe进程发送命令时,使用了换行符作为两条命令的分隔符。 需要注意的是,执行多条命令时需要保证目标进程支持多行或者分号分隔的命令。有些命令行工具可能不支持这种方式,此时需要根据具体情况采用其他的方式来执行多条命令。 ### 回答2: QProcess是Qt提供的一个类,用于执行外部命令。它可以执行单条命令,也可以通过设置参数执行多条命令。 在执行多条命令时,可以使用QProcess的setArguments函数来设置参数。参数是一个字符串列表,每个字符串表示一条命令。 比如,我们要执行两条命令:"mkdir test" 和 "cd test",可以按如下方式编写代码: ```cpp #include <QCoreApplication> #include <QProcess> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QProcess process; QStringList arguments; arguments << "mkdir" << "test"; process.setArguments(arguments); // 启动第一条命令,创建目录 process.start("cmd.exe"); // 等待第一条命令执行完成 process.waitForFinished(); // 设置第二条命令,进入目录 arguments.clear(); arguments << "cd" << "test"; process.setArguments(arguments); // 启动第二条命令,修改目录 process.start("cmd.exe"); // 等待第二条命令执行完成 process.waitForFinished(); return a.exec(); } ``` 上述代码首先创建了一个QProcess对象,然后通过setArguments函数设置了两个参数,分别代表创建目录和进入目录的两条命令。接着使用start函数启动第一条命令,并通过waitForFinished函数等待其执行完成。然后修改参数,启动第二条命令,并等待其执行完成。 通过这种方式,我们可以在一个QProcess对象中执行多条命令。当然,具体的命令和参数的设置还要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值