2010-08-16 34 views
35

Có thể mở một thư mục trong Trình tìm kiếm Windows Explorer/OS X và sau đó chọn/đánh dấu một tệp trong thư mục đó và thực hiện nó trong nền tảng chéo đường? Ngay bây giờ, tôi làm điều gì đó nhưCách "Hiển thị trong Trình tìm kiếm" hoặc "Hiển thị trong Explorer" với Qt

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

nơi đường dẫn đầy đủ vào thư mục tôi muốn mở. Rõ ràng, điều này sẽ chỉ mở thư mục và tôi sẽ phải theo dõi tệp tôi cần theo cách thủ công. Đây là một vấn đề khi có hàng ngàn tệp trong thư mục đó.

Nếu tôi đặt đường dẫn đến tệp cụ thể trong thư mục đó, thì tệp đó sẽ mở bằng ứng dụng mặc định cho loại mime đó và đó không phải là những gì tôi cần. Thay vào đó, tôi cần chức năng tương đương với "Hiển thị trong Trình tìm kiếm" hoặc "Hiển thị trong trình khám phá".

+0

Để làm rõ: ý của bạn là khi bạn nhấp vào "Hiển thị trong Trình đơn tìm kiếm "hoặc" Hiển thị trong Explorer "? –

+0

@Austin Vâng, ý tôi là chính xác một cái gì đó như "Tiết lộ trong Finder" hoặc "Hiển thị trong Explorer" – nnc

Trả lời

5

Có thể bạn có thể sử dụng QFileDialog::getOpenFileName để lấy tên tệp. Các tài liệu có sẵn here .. Các chức năng trên sẽ trả lại đường dẫn đầy đủ bao gồm tên file và phần mở rộng của nónếu có ..

Sau đó, bạn có thể cho

QDesktopServices::openUrl(path);

để mở tệp trong ứng dụng mặc định của nó, trong đó path sẽ là QString được trả lại bởi QFileDialog::getOpenFileName.

Hy vọng nó giúp ..

+3

cảm ơn câu trả lời, nhưng đó không phải là những gì tôi cần. Tôi đã cập nhật câu hỏi để cố làm rõ điều đó. Những gì tôi cần là chức năng "Hiển thị trong Trình tìm kiếm" hoặc "Hiển thị trong trình khám phá". – nnc

+0

Phương thức openUrl() - Phương thức QDesktopServices thực sự hiển thị một tệp/thư mục trong trình khám phá. Bạn đã thêm "tệp: ///" vào chuỗi đường dẫn của mình chưa? – Stradivari

+1

@liaK: OP chỉ muốn tệp ** hiển thị ** trong trình khám phá chứ không phải ** mở **. Phương pháp của bạn sẽ cố gắng ** mở ** tập tin. – diverger

33

Qt Creator có chức năng này, nó tầm thường để sao chép nó:

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 
} 

khác, liên quan đến bài viết trên blog (với mã đơn giản, tôi đã không thử nó vì vậy tôi có thể 't bình luận), là this.

Chỉnh sửa:

Có lỗi trong mã gốc khi pathIn chứa khoảng trắng trên Windows. QProcess::startDetached sẽ tự động trích dẫn một tham số nếu nó chứa dấu cách. Tuy nhiên, Windows Explorer sẽ không nhận ra một tham số được bao bọc trong dấu ngoặc kép và sẽ mở vị trí mặc định thay thế. Thử nó cho mình trong dòng lệnh 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" 

Như vậy,

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

được thay đổi để

QString command = explorer + " " + param; 
QProcess::startDetached(command); 
+1

Tôi đã kiểm tra mã trong bài đăng trên blog mà bạn đã liên kết. Nó hoạt động (ít nhất là trên Mac OS X). –

+0

Nếu bạn cần mở đường dẫn có chứa khoảng trống, bạn có thể sử dụng một cái gì đó như thế này: QProcess :: startDetached (QString ("explorer/select, \"% 1 \ ""). Arg (QDir :: toNativeSeparators (path))); – dismine

+0

Trước khi tôi cố gắng chuyển tất cả những thứ đó sang PyQt, bạn có thể xác nhận nó hoạt động trong Linux, lựa chọn tệp và tất cả? Bình luận 'chúng tôi không thể chọn một tập tin ở đây, bởi vì không có trình duyệt tập tin thực sự hỗ trợ nó' không âm thanh đầy hứa hẹn. –

4

mở tập tin trong Windows Explorer (không phải trình duyệt)

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

} 
+1

Rất tốt nếu bạn đang sử dụng một hệ điều hành đi kèm với Windows Explorer, nhưng hầu hết người dùng của tôi thích tránh những điều đó. ☺ –

+0

Ít bit của một hack Windows cụ thể nhưng hoạt động tuyệt vời, cảm ơn! – mrexodia

2

Đây là mã mà tôi đã sử dụng dựa trên các yếu tố đầu vào từ câu trả lời trước. Phiên bản này không phụ thuộc vào các phương pháp khác trong Qt Creator, chấp nhận tệp hoặc thư mục và có chế độ thu gọn để xử lý lỗi và các nền tảng khác:

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())); 
} 
+0

Tôi thích cách tiếp cận này vì nó đơn giản. Tôi chuyển sang python/PyQt5, có một cái nhìn [ở đây] (https://pastebin.com/xrcE3a2L). – normanius

+1

Đối với MacOS: Lưu ý rằng 'đường dẫn' phải tuyệt đối. Người ta có thể ngăn chặn thông điệp đầu ra từ 'osascript' bằng cách thêm lệnh' return'. – normanius

+0

Và một điều nữa: Chỉ cần thực hiện 'mở dirPath' sẽ đơn giản hơn trên MacOS, nhưng nó không làm nổi bật tệp nếu' path' thực sự là một tệp. – normanius

Các vấn đề liên quan