QFileDialog:如何在osX中打开/选择包中的file / dir

时间:2016-04-13 10:33:48

标签: c++ macos qt package qfiledialog

我已经google了很多,但是我找到了解决问题的相关方案。

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

CODE:

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

现在,在.MTS包下创建的AVCHD(Advanced Video Coding High Definition)个文件默认位于Sony&amp;松下高清摄像头,我想导入/选择.MTS个文件。

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

非常感谢任何想法。

感谢。

2 个答案:

答案 0 :(得分:2)

好吧,如果我理解你想要做什么,我不确定它在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视为一个包(或#34;包&#34;)。但是通过将treatsFilePackagesAsDirectories设置为YES,你可以让NSOpenPanel将其视为目录(当然,它确实是这样)。

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

enter image description here

NSOpenPanel中,它被视为目录:

enter image description here

答案 1 :(得分:1)

An OSX package是:

  

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

这类似于.mst or .msi file on Windows。与OSX软件包一样,您将无法在其中一个软件包中打开指定的文件。您的系统打开对话框实际上是允许您查看它们的 disservice ,因为您无法打开所述文件。

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