我必须使用 Qt 运行以下命令,这将弹出 Git GUI 窗口。
D:\MyWork\Temp\source>git gui
我该怎么做?
我尝试了以下方法,但没有成功:
QProcess process;
process.start("git gui",QStringList() << "D:\MyWork\Temp\source>");
试试这个:
QProcess process;
process.setWorkingDirectory("D:\\MyWork\\Temp\\source");
process.start("git", QStringList() << "gui");
或者如果你想在一行中完成,你可以这样做(这里我们使用
startDetached
而不是start
):
QProcess::startDetached("git", QStringList() << "gui", "D:\\MyWork\\Temp\\source");
在第二种情况下,最好检查返回代码(如果您的程序无法运行外部程序,则显示错误消息)。您也可以将所有参数放在第一个
program
字符串中(即 process.start("git gui");
也是允许的):
bool res = QProcess::startDetached("git gui", QStringList(), "D:\\MyWork\\Temp\\source");
if (!res) {
// show error message
}
我使用以下简单的代码段解决了我的问题
#include <QDir>
QDir::setCurrent("D:/MyWork/Temp/source");
system("git gui");
即使您使用Qt,您仍然可以调用Windows API。 ShellExecute 将完成这项工作
#include <Windows.h>
ShellExecute(NULL, NULL, "git", "gui", NULL, SW_SHOWNORMAL);
如果您的字符集是 Unicode(宽字符),请尝试以下代码
#include <Windows.h>
ShellExecute(NULL, NULL, _T("git"), _T("gui"), NULL, SW_SHOWNORMAL);
您无需担心分隔符,Qt 会为您处理好。
参见QDir文档
您不需要使用此函数来构建文件路径。如果你 始终使用“/”,Qt 会转换您的路径以符合 底层操作系统。如果你想显示用户的路径 使用操作系统的分隔符使用 toNativeSeparators()。
为了你的
QProcess
,试试这个。
QProcess gitProcess;
gitProcess.setWorkingDirectory("D:/MyWork/Temp/source");
gitProcess.setProgram("git"); // hope this is in your PATH
gitProcess.setArguments(QStringList() << "gui");
gitProcess.start();
if (gitProcess.waitForStarted()) {
// Now your app is running.
}
我知道这篇文章现在有点旧了,但我知道伊利亚的答案有什么问题(据我理解)。由于
QProcess
是在本地范围内创建的,因此每当您调用范围之外的进程时,析构函数都会被自动调用,并一路终止该进程,如调试消息所示:
进程(“git”)仍在运行时被销毁。
解决此问题的一种方法是在堆上实际动态分配
QProcess
的实例。确保进程完成后释放内存。
QProcess* process = new QProcess;
process->setWorkingDirectory("D:\\MyWork\\Temp\\source");
process->start("git", QStringList() << "gui");
或者等待该过程完成,使用
process.waitForFinished (-1);
我希望这对在这篇文章中寻找正确答案的人有所帮助。
不要使用 system() 这样做,这样你就可以留在 QT 框架内:
QDir::setCurrent("D:/MyWork/Temp/source");
myProcess.startDetached("git gui");