QT中使用QProcess启用外部程序和关闭外部程序

本文介绍了如何使用QT的QProcess类来启动外部程序,并详细解释了两种方法:start()和execute()。通过示例展示了如何避免主线程阻塞,以及如何在程序退出时正确关闭外部进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为目前的程序需要提供一个文件对比的功能,而目前已经有专门的文本对比软件,所以我打算直接调用外部的文本对比程序。
通过查阅QT的帮助文档,发现了QProcess这个类可以提供这种需求。
我找到的启动外部程序的方法有以下两种:
1、start()
void QProcess::start ( const  &  program, const  &  arguments,   mode = ReadWrite )

Starts the program program in a new process, passing the command line arguments in arguments. The  is set to mode.  will immediately enter the Starting state. If the process starts successfully, will emit (); otherwise, () will be emitted.

Note that arguments that contain spaces are not passed to the process as separate arguments.

Windows: Arguments that contain spaces are wrapped in quotes.

Note: Processes are started asynchronously, which means the () and () signals may be delayed. Call () to make sure the process has started (or has failed to start) and those signals have been emitted.

See also (), (), and ().

2、使用QProcess::execute(), 不过使用此方法时程序会最阻塞直到此方法执行的程序结束后返回,这时候可使用QProcess和QThread这两个类结合使用的方法来处理,以防止在主 线程中调用而导致阻塞的情况

先从QThread继承一个类,重新实现run()函数:

Quote:
class MyThread : public QThread
{
public:
void run();
};
void MyThread::run()
{
QProcess::execute("notepad.exe");
}
这 样,在使用的时候则可定义一个MyThread类型的成员变量,使用时调用其start()方法:

Quote:
class ...............
{...........
MyThread thread;
............
};
.....................
thread.start();
两个的具体的区别我不是很清楚,但我在程序中分别试了下,发现第二个会阻塞主程序,但使用start()则不会。

下面是我使用QProcess启动WinMerge的代码。

#include <QProcess>
QProcess *process = new QProcess;
QStringList str;
str << "";
process->start("./WinMerge/WinMergeU.exe",str);
如果程序里面不输入参数,就会直接到软件直接运行时的界面。
加参数后弹出的界面是工具栏第一列中的第一个需要输入的界面(这个是我猜测的,不确定,但确实能弹出)。
下面是截图:
GUI里的按钮:


点击交换机配置比较后:



嗯,这样就可以启动外部程序了。

^-^补充:在主程序退出时,启动的外部程序是不会随着主程序的退出而退出的,我们当然不希望这种情况。
继续查阅QT帮助文档,发现close这个函数,看下它的说明:
void QProcess::close ()   [virtual]

Closes all communication with the process and kills it. After calling this function,  will no longer emit (), and data can no longer be read or written.

Reimplemented from .

可以看到,调用这个后会关闭所有的process启动的外部程序。因此,可以在主程序推出前,加一个判断

if(process) 
process->close();
delete process;
process = 0;






<think>嗯,用户现在问的是如何在Linux系统下用Qt编写二进制程序来获取shell的信息。首先,我需要理解用户的需求。他们可能想要通过一个Qt应用程序执行shell命令并获取输出,或者监控系统信息,比如CPU使用率、内存占用、磁盘空间等。这可能涉及到系统调用的封装、进程间通信,或者直接使用Qt提供的类来执行外部命令。 用户之前遇到了QMessageBox未声明的错误,现在转向另一个问题,可能是在开发过程中需要与系统交互,所以需要获取shell的信息。这时候,我需要考虑Qt中执行外部命令的方法,比如QProcess类。QProcessQt中用于启动外部程序并与之通信的类,非常适合执行shell命令并获取输出。 接下来,我需要组织步骤。首先,用户需要包含必要的头文件,比如QProcessQDebug。然后,使用QProcess::execute()或者start()来执行命令。如果用户需要实时获取输出,可能需要使用信号槽机制,异步读取标准输出错误。 另外,用户可能需要处理不同的shell命令,比如获取系统信息的命令(如top、free、df等),或者自定义脚本。这时候,需要注意命令的路径权限问题,可能需要使用绝对路径或者设置环境变量。 还有,用户可能需要将获取的信息显示在GUI上,比如用QMessageBox显示结果,或者更新界面上的标签、文本框。这时候需要结合Qt的UI组件,比如QLabel或QTextEdit,来展示实时数据。 安全性也是一个考虑因素,执行外部命令可能存在注入风险,特别是如果命令参数来自用户输入的话。需要提醒用户对输入进行验证过滤,避免执行恶意命令。 另外,考虑到用户可能是在Linux环境下开发,需要确保Qt项目配置正确,比如.pro文件中包含必要的模块,比如core可能需要的其他模块。如果用户之前遇到过QMessageBox的问题,确保widgets模块已经正确添加。 可能还需要处理命令执行中的错误,比如命令不存在或执行失败的情况。这时候需要检查QProcess退出状态码错误信息,并做相应的错误处理。 最后,提供一个完整的示例代码会很有帮助,让用户能够直接复制、修改并运行。同时,解释代码的关键部分,比如如何同步执行命令、异步读取输出,以及如何处理错误,这样用户能更好地理解实现原理。 总结下来,回答需要涵盖以下几点: 1. 使用QProcess执行shell命令。 2. 同步异步获取输出的方法。 3. 示例代码,包括获取系统信息的命令。 4. 错误处理安全性注意事项。 5. 结合Qt的UI组件展示信息。 6. 项目配置的确认,确保模块正确包含。 需要确保回答结构清晰,步骤明确,用户能够逐步实现功能。同时,语言要简洁,避免过多技术术语,让新手也能理解。可能还需要提醒用户注意命令执行的时间资源消耗,避免阻塞主线程,导致界面卡顿,这时候异步方法就显得尤为重要。</think>在Linux系统中使用Qt编写二进制程序获取Shell信息,通常通过**执行Shell命令并捕获输出**实现。以下是详细实现步骤示例代码: --- ### 一、核心工具:`QProcess`类 Qt提供`QProcess`类用于启动外部进程(如Shell命令),并与其输入/输出交互。 --- ### 二、实现方式 #### 1. **同步执行命令(阻塞方式)** 直接获取命令执行结果,适合快速操作: ```cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QProcess process; process.start("bash", QStringList() << "-c" << "ls -l /"); // 执行命令 process.waitForFinished(); // 等待命令完成 QString output = process.readAllStandardOutput(); // 获取标准输出 qDebug() << "命令输出:\n" << output; return 0; // 非GUI程序需用app.exec()保持事件循环 } ``` #### 2. **异步执行命令(非阻塞方式)** 通过信号槽机制实时获取输出,适合长时间任务: ```cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QProcess *process = new QProcess; QObject::connect(process, &QProcess::readyReadStandardOutput, [process]() { qDebug() << "实时输出:" << process->readAllStandardOutput(); }); QObject::connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [](int exitCode, QProcess::ExitStatus status) { qDebug() << "命令结束,退出码:" << exitCode; }); process->start("bash", QStringList() << "-c" << "ping -c 4 127.0.0.1"); return app.exec(); // 保持事件循环 } ``` --- ### 三、常用Shell信息获取示例 #### 1. **获取CPU信息** ```cpp QProcess process; process.start("bash", QStringList() << "-c" << "lscpu | grep 'Model name'"); process.waitForFinished(); QString cpuInfo = process.readAllStandardOutput().trimmed(); ``` #### 2. **获取内存使用率** ```cpp process.start("bash", QStringList() << "-c" << "free -m | awk '/Mem/{print $3 \" MB\"}'"); process.waitForFinished(); QString memUsage = process.readAllStandardOutput().trimmed(); ``` #### 3. **获取磁盘空间** ```cpp process.start("bash", QStringList() << "-c" << "df -h / | awk 'NR==2{print $4}'"); process.waitForFinished(); QString diskFree = process.readAllStandardOutput().trimmed(); ``` --- ### 四、结合GUI显示信息 在Qt Widgets应用中展示结果(需包含`QT += widgets`): ```cpp #include <QApplication> #include <QLabel> #include <QProcess> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label; QProcess process; process.start("bash", QStringList() << "-c" << "date"); process.waitForFinished(); label.setText("当前时间: " + process.readAllStandardOutput()); label.show(); return app.exec(); } ``` --- ### 五、注意事项 1. **路径问题**:建议使用绝对路径(如`/bin/bash`代替`bash`)。 2. **错误处理**:检查`process.exitCode()``process.errorString()`。 3. **安全性**:避免直接执行用户输入的未过滤命令。 4. **性能**:耗时命令建议异步执行,防止界面卡死。 --- ### 六、完整项目配置(.pro文件) ```qmake QT += core widgets # 基础模块 CONFIG += c++11 # 启用C++11支持 TARGET = ShellInfo # 可执行文件名 SOURCES += main.cpp ``` 通过上述方法,你可以灵活地在Qt程序中集成Shell命令交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值