QFileDialog:如何从 osX 中的包 open/select file/dir

QFileDialog: How to open/select file/dir from package in osX

我在谷歌上搜索了很多,但还是找不到解决我问题的相关方法。

问题: 我想打开 .MTS 文件及其工作查找(如果它在 directory 中可用)。但是,如果它在任何 package 中,那么我的 QFileDialog 将无法查看该包和 select 那些 .MTS 文件。

代码:

auto filePaths = QFileDialog::getOpenFileNames(this, "Open Video File", lastOpenedPath, "*.MTS;*.mov");
    qDebug() << "File Paths " << filePaths;

现在在 AVCHD(Advanced Video Coding High Definition) 包下创建的 .MTS 文件在 Sony & Panasonic 高清摄像机中默认,我想 import/select 那 .MTS 个文件。

提示: QFileDialog 能够 import/select Windows mac 中的那些 .MTS 文件,但未能 import/select 在 mac machine.

非常感谢任何想法。

谢谢。

An OSX package 是一个:

File system directory that is normally displayed to the user by the Finder as if it were a single file. Such a directory may be the top-level of a directory tree of objects stored as files, or it may be other archives of files or objects for various purposes, such as installer packages, or backup archives.

这类似于 .mst or .msi file on Windows。与 OSX 包一样,您将无法在其中一个包中打开指定的文件。您的系统打开对话框实际上是在给您造成损害,因为您无法打开上述文件,因为您无法查看这些文件。

您的解决方法是将文件从程序包外部复制到程序中,然后打开文件的副本。

好吧,如果我理解你想要做什么,我不确定单独使用 Qt 是否可行。

结果确实比我预期的要简单,只需调用 Cocoa 和 NSOpenPanel 即可实现我认为您正在寻找的东西。

示例项目位于:https://github.com/NSGod/widgetsOpenFileDialogCocoa

基本上,我将 mainwindow.cpp 重命名为 mainwindow.mm,然后添加了一个 #import <Cocoa/Cocoa.h>:

#import <Cocoa/Cocoa.h>

void MainWindow::on_openFileButton_clicked()
{
    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel setAllowedFileTypes:[NSArray arrayWithObjects:@"mts", @"mov", nil]];
    [openPanel setAllowsMultipleSelection:YES];
    [openPanel setTreatsFilePackagesAsDirectories:YES];
    [openPanel setTitle:@"Open Video File"];

    NSInteger result = [openPanel runModal];

    QStringList stringList;

    if (result == NSFileHandlingPanelOKButton) {
        NSArray *URLs = [openPanel URLs];
        NSLog(@"URLs == %@", URLs);
        for (NSURL *URL in URLs) {
            stringList += QString::fromNSString(URL.path);
        }
        // do something with stringList
        qDebug() << "filePaths == " << stringList;
    }
}

项目中包含一个fakeBundle.component目录,OS X会将其视为一个包(或"package")。但是通过将treatsFilePackagesAsDirectories设置为是的,您可以让 NSOpenPanel 将其视为一个目录(当然,它确实如此)。

这是一张图片,显示了 Finder 如何将此 fakeBundle.component 目录视为单个文件:

NSOpenPanel 中,它被视为一个目录: