web-dev-qa-db-ja.com

Qtで「Finderで表示」または「エクスプローラーで表示」する方法

Windowsエクスプローラー/ OS X Finderでフォルダーを開き、そのフォルダー内の1つのファイルを選択/強調表示して、クロスプラットフォームの方法でそれを行うことは可能ですか?現在、私は次のようなことをしています

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

ここで、pathは、開きたいフォルダへのフルパスです。明らかに、これはフォルダを開くだけなので、必要なファイルを手動で追跡する必要があります。そのフォルダーに何千ものファイルがある場合、これは少し問題です。

そのフォルダー内の特定のファイルへのパスにすると、そのファイルはそのMIMEタイプのデフォルトのアプリケーションで開かれますが、これは必要ありません。代わりに、「Reveal in Finder」または「Show in Explorer」と同等の機能が必要です。

53
nnc

Qt Creatorsource )にはこの機能があり、コピーするのは簡単です:

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);
    }
}

別の関連するブログ投稿(より単純なコードで、私は試していないのでコメントできない)は this です。

編集:

WindowsでpathInにスペースが含まれている場合、元のコードにバグがあります。 QProcess :: startDetached は、スペースが含まれているパラメーターを自動的に引用します。ただし、Windowsエクスプローラーは引用符で囲まれたパラメーターを認識せず、代わりにデフォルトの場所を開きます。 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"

したがって、

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

に変更されます

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

おそらく、_QFileDialog::getOpenFileName_を使用してファイル名を取得できます。ドキュメントは利用可能です here ..上記の関数はファイル名とその拡張子を含む完全なパスを返します存在する場合..

その後、あなたは与えることができます

QDesktopServices::openUrl(path);

デフォルトのアプリケーションでファイルを開くには、pathは_QFileDialog::getOpenFileName_によって返されるQStringになります。

それが役に立てば幸い..

10
liaK

Windowsエクスプローラーでファイルを開く(ブラウザーではない)

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); 

}
4
Elias

これは、以前の回答からの入力に基づいて使用したコードです。このバージョンはQt Creatorの他のメソッドに依存せず、ファイルまたはディレクトリを受け入れ、エラー処理および他のプラットフォーム用のフォールバックモードを備えています。

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

このソリューションは、Windowsと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