Qt Creator ma tę funkcję, to jest trywialne, aby ją skopiować:
void FolderNavigationWidget::showInGraphicalShell(QWidget *parent, const QString &pathIn)
{
// Mac, Windows support folder or file.
#if defined(Q_OS_WIN)
const QString explorer = Environment::systemEnvironment().searchInPath(QLatin1String("explorer.exe"));
if (explorer.isEmpty()) {
QMessageBox::warning(parent,
tr("Launching Windows Explorer failed"),
tr("Could not find explorer.exe in path to launch Windows Explorer."));
return;
}
QString param;
if (!QFileInfo(pathIn).isDir())
param = QLatin1String("/select,");
param += QDir::toNativeSeparators(pathIn);
QString command = explorer + " " + param;
QProcess::startDetached(command);
#elif defined(Q_OS_MAC)
Q_UNUSED(parent)
QStringList scriptArgs;
scriptArgs << QLatin1String("-e")
<< QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"")
.arg(pathIn);
QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
scriptArgs.clear();
scriptArgs << QLatin1String("-e")
<< QLatin1String("tell application \"Finder\" to activate");
QProcess::execute("/usr/bin/osascript", scriptArgs);
#else
// we cannot select a file here, because no file browser really supports it...
const QFileInfo fileInfo(pathIn);
const QString folder = fileInfo.absoluteFilePath();
const QString app = Utils::UnixUtils::fileBrowser(Core::ICore::instance()->settings());
QProcess browserProc;
const QString browserArgs = Utils::UnixUtils::substituteFileBrowserParameters(app, folder);
if (debug)
qDebug() << browserArgs;
bool success = browserProc.startDetached(browserArgs);
const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
success = success && error.isEmpty();
if (!success)
showGraphicalShellError(parent, app, error);
#endif
}
Innym, związanych blogu (z prostszej kodu, ja nie próbowałem go więc mogę komentarz), jest this.
Edit:
Jest to błąd w oryginalnym kodzie kiedy pathIn zawiera spacje w systemie Windows. QProcess::startDetached automatycznie przytoczy parametr, jeśli zawiera spacje. Jednak Eksplorator Windows nie rozpoznaje parametru zawiniętego w cudzysłowy i zamiast niego otworzy domyślną lokalizację. Spróbuj sam w wierszu poleceń systemu Windows:
echo. > "C:\a file with space.txt"
:: The following works
C:\Windows\explorer.exe /select,C:\a file with space.txt
:: The following does not work
C:\Windows\explorer.exe "/select,C:\a file with space.txt"
Zatem
QProcess::startDetached(explorer, QStringList(param));
jest zmieniana na
QString command = explorer + " " + param;
QProcess::startDetached(command);
do wyjaśnienia: Masz na myśli po kliknięciu „Reveal w Finder "lub" Pokaż w Eksploratorze "element menu? –
@Austin Tak, chodzi mi o to, że jest dokładnie coś takiego jak "Reveal in Finder" lub "Show in Explorer" – nnc