【发布时间】:2015-11-23 07:30:43
【问题描述】:
我必须使用 Qt 运行以下命令,这将弹出 Git GUI 窗口。
D:\MyWork\Temp\source>git gui
我该怎么做?
我尝试了以下方法,但没有成功:
QProcess process;
process.start("git gui",QStringList() << "D:\MyWork\Temp\source>");
【问题讨论】:
我必须使用 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
}
【讨论】:
QProcess::startDetached("C:\\Users\\<username>\\AppData\\Local\\GitHub\\PortableGit_<numbersandletters>\\bin\\git.exe", QStringList() << "gui", "D:\\MyWork\\Temp\\source"); 这样的东西? (请设置正确的路径!) 2)感谢您指出这一点,我修正了这个错误。
"\"c:\\path with spaces\\prog.exe\")。
我使用以下简单的代码段解决了我的问题
#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 会为您处理。
您不需要使用此函数来构建文件路径。如果你 总是使用“/”,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.
}
【讨论】:
我知道这篇文章现在有点老了,但我知道 Ilya 的回答有什么问题(据我了解)。由于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");
【讨论】: