【问题标题】:QFileDialog: How to open/select file/dir from package in osXQFileDialog:如何在 osX 中从包中打开/选择文件/目录
【发布时间】:2016-08-04 09:25:18
【问题描述】:

我用谷歌搜索了很多,但找不到任何相关的解决方案来解决我的问题。

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

代码:

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

现在AVCHD(Advanced Video Coding High Definition) 包下创建的.MTS 文件默认在索尼和松下高清摄像机中,我想导入/选择该.MTS 文件。

提示: QFileDialog 可以在 Windows 机器上导入/选择那些 .MTS 文件,但在 mac 机器上无法导入/选择。

非常感谢任何想法。

谢谢。

【问题讨论】:

  • 您能否举一个完整文件路径到您可以在对话框中打开的.MTS文件和完整文件的示例您当前无法打开但想要打开的 .MTS 文件的路径?我想确保我理解正确。

标签: c++ macos qt package qfiledialog


【解决方案1】:

好吧,如果我了解您想要正确执行的操作,我不确定仅在 Qt 中是否可行。

结果确实比我预期的要容易,只需致电 Cocoa 和 NSOpenPanel 即可实现我认为您正在寻找的目标。

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

基本上,我将mainwindow.cpp 重命名为mainwindow.mm,然后添加了#import &lt;Cocoa/Cocoa.h&gt;

#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 会将其视为捆绑包(或“包”)。但是通过将treatsFilePackagesAsDirectories 设置为YES,您可以让NSOpenPanel 将其视为一个目录(它确实是,当然)。

下图显示了 Finder 如何将此 fakeBundle.component 目录视为单个文件:

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

【讨论】:

  • 感谢您的详细解答。很高兴了解如何在 OSX 中完成。我评论过,也许我应该将它包含在答案中,你不能只用 Qt/C++ 做到这一点:stackoverflow.com/questions/36595747/… 这个答案为如何实现这一点提供了一个巨大的起点。 +1
  • @NSGod:谢谢,它对我有用。现在可以查看捆绑包并选择.MTS 文件。 +1
【解决方案2】:

An OSX package 是:

Finder 通常向用户显示的文件系统目录,就好像它是单个文件一样。这样的目录可能是存储为文件的对象目录树的顶层,也可能是用于各种目的的文件或对象的其他存档,例如安装程序包或备份存档。

这类似于.mst or .msi file on Windows。就像使用 OSX 软件包一样,您将无法在这些软件包之一中打开您指定的文件。您的系统打开对话框实际上对您造成了伤害,因为您无法打开所述文件。

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

【讨论】:

  • 感谢您的回复。这就是我目前正在做的事情。 “将文件从包中复制到程序外部然后打开文件的副本”,但是还有其他解决方案吗?我可以限制只打开AVCHD 包/任何包吗?
  • @ABBolim 首先你的文件打开对话框不应该让你看到里面的包:apple.stackexchange.com/q/768 所以肯定有一些东西在进行中。其次,我认为您最好的选择是提供拖放支持。这样某人就可以在您的程序外部导航到该包,然后将文件的图标拖放到您的程序上,从而使 OSX 为您进行解压缩。
  • 好的。知道了。但是文件对话框可以允许选择任何包吗?这样使用该包的路径并在运行时提取该包并从该特定包中选择那些.MTS 文件。
  • @ABBolim 如果您在命令提示符下查看软件包,它们将具有扩展名,您需要将其添加到您的 QFileDialog 说明符中。但这不会让你一路走好,你还需要找到一个库来从包中提取文件,而且你可能知道,这样的问题是beyond the scope of http://www.stackoverflow.com
  • @JonathanMee:问题是,我对 Qt 知之甚少,所以在这一点上,答案不会超出“它应该是可能的,因为底层操作系统支持它,但是如何在 Qt 中完成它,我不知道。这是我在 Cocoa (Objective-C) 中将如何做到的......"。我的系统上有 Qt,如果有机会,我会查看源代码...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2013-02-24
  • 2010-09-22
相关资源
最近更新 更多