在Qt小部件应用程序中显示cmd终端

showing cmd terminal in qt widgets application

本文关键字:显示 cmd 终端 应用程序 Qt 小部      更新时间:2023-10-16

我正在尝试使用 system() 传递一些 cmd 命令,我希望能够与 cmd "通信",比如说我在主窗口中用system("dir")编码.cpp在我点击的函数下

例如,这就是它的样子

void MainWindow::on_pushButton_login_clicked()
{
std::string platform_server_ip  = ui->lineEdit_platform_server_ip->text().toStdString();   
if (platform_server_ip == "dir"
{
QMessageBox::information(this,"Login", "all required log in details are correct");
close();
const char* c = platform_server_ip.c_str();
system(c);
system("ipconfig");

}

我想知道为什么它表现得这样,这是否正常。我已经包括了CONFIG += console在我的项目文件中,并选中"在终端中运行"(也尝试过没有),但它从未向我显示我想要的结果

相反,我得到的是一个空白终端,它在我的 GUI 旁边弹出,然后当我在我的 GUI 中输入"dir"并按回车键时,一个 cmd 窗口弹出得非常快,不到一秒钟,它就消失了。我什至用system("ipconfig")system ("pause")尝试过 以及像这样的一个系统命令system("ipconfig" "&pause")

期望的结果:只是系统("ipconfig")的正常执行,后跟其他系统命令,显示的结果与在cmd本身中键入它们的结果相同。

我也在"qt 控制台应用程序"中尝试了所有这些,我要么得到相同的结果,要么在 qt creator 的"应用程序输出"中找到输出(通常在 cmd 上作为输出)。

有没有更好的方法可以实现我想要的? 我真的是一个菜鸟,非常感谢一些指导。

你可以试试

system("cmd /k ipconfig");

这将打开另一个终端窗口,该窗口将在命令执行结束时保持打开状态(k代表keep)。

我认为您不需要CONFIG += console项目设置即可实现这一目标。调用system将启动另一个进程,该进程与调用应用程序完全无关。

如果要从Qt应用程序中启动外部程序,可以使用QProcess类,该类允许您通过标准输入/输出以某种方式与启动的进程进行交互。举一个非常简单的例子,有一个带有按钮和文本编辑的表单,称为textEdit;在按钮clicked插槽中:

QProcess process;
process.start("ipconfig");
process.waitForReadyRead();
ui->textEdit->setText(process.readAll());
process.waitForFinished();

这样,您将不会看到其他控制台窗口,命令输出将直接显示在文本编辑中。

这可以概括为这样的函数:

bool exec(QString command)
{
QProcess process;
process.start(command);
if(!process.waitForStarted())
{
return false; //the process failed to start
}
//etc...
return true;
}

根据这是否不仅仅是一个快速的黑客/工具,您可以查看 QProcess 以更深入地控制您的进程,以便您可以读取/写入子进程管道。