通过 Qt GUI 向 CMD 传递/给出命令

Posted

技术标签:

【中文标题】通过 Qt GUI 向 CMD 传递/给出命令【英文标题】:Passing/giving commands to CMD through Qt GUI 【发布时间】:2018-03-02 13:09:57 【问题描述】:

我想要实现(并且正在努力)基本上是通过我的 QT Mainwindow 应用程序将命令传递给 CMD。

我想要我的代码,首先运行 CMD(最好是隐藏的)。我在这里使用了这样的 QProcess:

(在我的 Mainwindow.cpp 文件中)

QString exePath = "C:/Windows/System32/cmd.exe";
      QProcess pro;
               pro.startDetached(exePath);
               pro.waitForStarted();

this question helped me a lot

但是,这个答案/问题缺少的是对“附加”命令到 CMD 的实际帮助(不确定这是否是一个正确的术语,如果我错了,请纠正我!) 我已经用这段代码尝试了以下方法

(也在我的 Mainwindow.cpp 文件中)

string exepathstring = "C:/Windows/System32/cmd.exe"; //because fstream doesnt accept argument of type QString
      QProcess pro;
           pro.startDetached(exePath);   //do I have to use "detached" here?
           pro.waitForFinished();   //not sure if i should use "for 
                              //finished" or "for started" or something else

      string connecttoserver = ui->lineEdit_command->text().toStdString();   //this is where people input a cmd command
                                                                             //need to convert it to to be able to append it
       fstream myoutfile(exepathstring, ios::in | ios::out | ios::app);
         myoutfile <<""<< connecttoserver << endl;

希望我可以使用普通的“附加到文件”代码,但它什么也没做,我什至没有收到错误:(

谁能告诉我哪里出错了? 我怎样才能实现我想要的?

这是

    在启动我的“主窗口应用程序”时启动 cmd(最好是隐藏的)

    获取用户输入并让我的应用在单击按钮时将其传递给 cmd。

这是我的整个 ma​​inwindow.cpp 源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QString>
#include <fstream>
#include <iostream>
using namespace std;

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
      ui(new Ui::MainWindow)
         ui->setupUi(this);

MainWindow::~MainWindow()
delete ui;


void MainWindow::on_pushButton_clicked()

      QString exePath      = "C:/Windows/System32/cmd.exe";
      string exepathstring = "C:/Windows/System32/cmd.exe"; //because fstream doesnt accept argument of type QString

     QProcess pro;
              pro.startDetached(exePath); 
              pro.waitForFinished();   //not sure if i should use "for finished" or "for started" or something else

     string connecttoserver = ui->lineEdit_command->text().toStdString();   /*this is where people input a cmd command
                                                                           need to convert it to to be able to append it*/
     fstream myoutfile(exepathstring, ios::in | ios::out | ios::app);
             myoutfile <<""<< connecttoserver << endl;
    

任何输入都会对我有很大帮助 ^.^ 如果我使用了错误的术语,我真的很抱歉

【问题讨论】:

与您的问题没有直接关系,但正确缩进您的代码将使人们更容易提供帮助。 :) 感谢您指出这一点,希望现在更好:D 我觉得现在更糟了,不知何故,哈哈。 :s 如果在 Creator 中选择代码然后按 Ctrl+I 会自动修复。 【参考方案1】:

如果您查看此post,一个明显的问题是您正在使用static 方法startDetached()阻塞 函数waitForFinished() ... QProcess::waitForStarted()/@ 987654326@ 不会捕获来自分离的 QProcess 的信号; 因此你可以使用:

QProcess pro;
pro.start(exePath); 
pro.waitForStarted(); // the correct is `waitForStarted()`

您对fstream 的尝试并不清楚-对我而言-在您的描述中,您希望用户向您的进程发送命令: 例如,这可能是:

QByteArray user_cmd = QVariant(ui->lineEdit_command->text()).toByteArray();
pro.write(user_cmd);
pro.write("\n\r"); // press Enter to execute the command

因此您的代码可能是:

.h

#include <QProcess>
namespace Ui 
class MainWindow;

class MainWindow : public QMainWindow

    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void readResult();
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
     QProcess* pro;
;

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked);
    QString exePath = "C:/Windows/System32";
    pro = new QProcess(parent);
    pro->setWorkingDirectory(exePath);
    pro->setReadChannel(QProcess::StandardOutput);
    connect(pro,&QProcess::readyReadStandardOutput, this, &MainWindow::readResult);
    pro->start("cmd.exe");
    if (!pro->waitForStarted())
    
      qDebug() << "The process didnt start" << pro->error();
    

void MainWindow::on_pushButton_clicked()

    if (ui->lineEdit_command->text().isEmpty())
        return;
    QByteArray cmd = QVariant(ui->lineEdit_command->text()).toByteArray();
     pro->write(cmd);
     pro->write("\n\r");
     ui->lineEdit_command->clear();


void MainWindow::readResult()

    while(pro->bytesAvailable())
    QString dirout =  pro->readLine();
    qDebug() << dirout;
    

MainWindow::~MainWindow()

    delete ui;

【讨论】:

以上是关于通过 Qt GUI 向 CMD 传递/给出命令的主要内容,如果未能解决你的问题,请参考以下文章

qt如何向cmd写入命令啊?求大牛指导!!!跪谢。。。

Jmeter在非GUI环境下传递参数(命令行&Jenkins配置)

Jmeter在非GUI环境下传递参数(命令行&Jenkins配置)

python如何向cmd发送命令

嵌入式linux QT开发——GUI原理分析

嵌入式linux QT开发——GUI原理分析