简体   繁体   中英

Qt launch cmd.exe

I want to start cmd.exe with QProcess without startDetached because I need to interact with the running cmd. and the cmd has to be in forground. and I want to get readyRead() once the first process completes and then I'll do some other tasks, like showing some message box or launching another cmd.exe or executing another command in that cmd window. But the cmd window must be visible to user.

It sounds like you want to run a command-line process (or several), display its output while it runs, and then run another process when it's done.

I usually do this by having a read-only QPlainTextEdit in my main window to display io to the command-line. Create a QProcess on the heap and connect its readyReadStandardError and readyReadStandardOutput signals to a slot in your main window that prints the text to your QPlainTextEdit. Then launch your command-line program with arguments with QProcess::start and wait for it to finish. Once it finishes, start your next process the same way.

You could also just enable a console in Qt along side your GUI.

Console output in a Qt GUI app?

And then use qDebug calls to put text out to the debug window or use iostream with std::cout and std::cin .

EDIT: To show the console, in your .pro add "CONFIG += console" and then in your Project > Run settings, be sure to check "Run in terminal".

EDIT2:

https://www.google.com/search?q=qprocess+cmd

http://www.qtcentre.org/threads/12757-QProcess-cmd

#include <QByteArray>
#include <QProcess>
#include <iostream>
#include <string>

using namespace std;

int main(int argc,char** argv)
{
    QProcess cmd;
    cmd.start("cmd");
    if (!cmd.waitForStarted())
        return false;
    cmd.waitForReadyRead();
    QByteArray result = cmd.readAll();
    cout << result.data();

    string str;
    getline(cin,str);
    while(str != string("exit"))
    {
        cmd.write(str.c_str());
        cmd.write("\n");
        cmd.waitForReadyRead();
        result = cmd.readAll();
        cout << result.data();
        getline(cin,str);
    }
}

I tested the code here, and it lets you interact with the commandline and get the output back through readyread(), but if you are running it with a GUI, you will need to move this while loop from the main to happen in another thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM