webentwicklung-frage-antwort-db.com.de

Wie Sie mit Qt "Im Finder anzeigen" oder "Im Explorer anzeigen"

Ist es möglich, einen Ordner in Windows Explorer/OS X Finder zu öffnen und dann eine Datei in diesem Ordner auszuwählen/hervorzuheben, und dies plattformübergreifend? Im Moment mache ich sowas

QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );

dabei steht path für den vollständigen Pfad zu dem Ordner, den ich öffnen möchte. Offensichtlich öffnet dies nur den Ordner und ich muss die benötigte Datei manuell aufspüren. Dies ist ein kleines Problem, wenn sich in diesem Ordner Tausende von Dateien befinden.

Wenn ich einen Pfad zu einer bestimmten Datei in diesem Ordner festlege, ist diese Datei mit der Standardanwendung für diesen MIME-Typ geöffnet, und das ist nicht das, was ich brauche. Stattdessen benötige ich die Funktionalität "Im Finder anzeigen" oder "Im Explorer anzeigen".

45
nnc

Qt Creator ( source ) hat diese Funktionalität, es ist trivial, sie zu kopieren:

void FileUtils::showInGraphicalShell(QWidget *parent, const QString &pathIn)
{
    const QFileInfo fileInfo(pathIn);
    // Mac, Windows support folder or file.
    if (HostOsInfo::isWindowsHost()) {
        const FileName Explorer = Environment::systemEnvironment().searchInPath(QLatin1String("Explorer.exe"));
        if (Explorer.isEmpty()) {
            QMessageBox::warning(parent,
                                 QApplication::translate("Core::Internal",
                                                         "Launching Windows Explorer Failed"),
                                 QApplication::translate("Core::Internal",
                                                         "Could not find Explorer.exe in path to launch Windows Explorer."));
            return;
        }
        QStringList param;
        if (!fileInfo.isDir())
            param += QLatin1String("/select,");
        param += QDir::toNativeSeparators(fileInfo.canonicalFilePath());
        QProcess::startDetached(Explorer.toString(), param);
    } else if (HostOsInfo::isMacHost()) {
        QStringList scriptArgs;
        scriptArgs << QLatin1String("-e")
                   << QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"")
                                         .arg(fileInfo.canonicalFilePath());
        QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
        scriptArgs.clear();
        scriptArgs << QLatin1String("-e")
                   << QLatin1String("tell application \"Finder\" to activate");
        QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
    } else {
        // we cannot select a file here, because no file browser really supports it...
        const QString folder = fileInfo.isDir() ? fileInfo.absoluteFilePath() : fileInfo.filePath();
        const QString app = UnixUtils::fileBrowser(ICore::settings());
        QProcess browserProc;
        const QString browserArgs = UnixUtils::substituteFileBrowserParameters(app, folder);
        bool success = browserProc.startDetached(browserArgs);
        const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
        success = success && error.isEmpty();
        if (!success)
            showGraphicalShellError(parent, app, error);
    }
}

Ein anderer, verwandter Blog-Beitrag (mit einfacherem Code, den ich nicht ausprobiert habe, also nicht kommentieren kann) ist this .

Bearbeiten:

Es gibt einen Fehler im Originalcode, wenn pathIn unter Windows Leerzeichen enthält. QProcess :: startDetached zitiert automatisch einen Parameter, wenn dieser Leerzeichen enthält. Windows Explorer erkennt jedoch keine in Anführungszeichen eingeschlossenen Parameter und öffnet stattdessen den Standardspeicherort. Probieren Sie es selbst in der Windows-Befehlszeile aus:

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"

Somit,

QProcess::startDetached(Explorer, QStringList(param));

wird geändert zu

QString command = Explorer + " " + param;
QProcess::startDetached(command);
38
Ivo

Möglicherweise können Sie QFileDialog::getOpenFileName verwenden, um den Dateinamen abzurufen. Die Dokumentation ist verfügbar hier .. Die obige Funktion wird den vollständigen Pfad einschließlich des Dateinamens und seiner Erweiterung zurückgeben falls vorhanden ..

Dann kannst du geben

QDesktopServices::openUrl(path);

um die Datei in ihrer Standardanwendung zu öffnen, wobei path die von QFileDialog::getOpenFileName zurückgegebene QString ist.

Ich hoffe es hilft..

8
liaK

Datei im Windows Explorer öffnen (nicht im Browser)

void OpenFileInExplorer()
{
   QString path = "C:/exampleDir/example.txt";

   QStringList args;

   args << "/select," << QDir::toNativeSeparators(path);

   QProcess *process = new QProcess(this);
   process->start("Explorer.exe", args); 

}
5
Elias

Hier ist der Code, den ich basierend auf den Eingaben einer vorherigen Antwort verwendet habe. Diese Version ist nicht von anderen Methoden in Qt Creator abhängig, akzeptiert eine Datei oder ein Verzeichnis und verfügt über einen Fallback-Modus für die Fehlerbehandlung und andere Plattformen:

void Util::showInFolder(const QString& path)
{
    QFileInfo info(path);
#if defined(Q_OS_WIN)
    QStringList args;
    if (!info.isDir())
        args << "/select,";
    args << QDir::toNativeSeparators(path);
    if (QProcess::startDetached("Explorer", args))
        return;
#Elif defined(Q_OS_MAC)
    QStringList args;
    args << "-e";
    args << "tell application \"Finder\"";
    args << "-e";
    args << "activate";
    args << "-e";
    args << "select POSIX file \"" + path + "\"";
    args << "-e";
    args << "end tell";
    args << "-e";
    args << "return";
    if (!QProcess::execute("/usr/bin/osascript", args))
        return;
#endif
    QDesktopServices::openUrl(QUrl::fromLocalFile(info.isDir()? path : info.path()));
}
2
Dan Dennedy

Diese Lösung funktioniert sowohl unter Windows als auch unter Mac:

void showFileInFolder(const QString &path){
    #ifdef _WIN32    //Code for Windows
        QProcess::startDetached("Explorer.exe", {"/select,", QDir::toNativeSeparators(path)});
    #Elif defined(__Apple__)    //Code for Mac
        QProcess::execute("/usr/bin/osascript", {"-e", "tell application \"Finder\" to reveal POSIX file \"" + path + "\""});
        QProcess::execute("/usr/bin/osascript", {"-e", "tell application \"Finder\" to activate"});
    #endif
}
0
Donald Duck