使用Qt的NSSavePanel进行本机保存对话框

时间:2014-01-30 16:43:01

标签: macos qt5 objective-c++

以下代码大部分时间都可以使用,也许更有经验的Objective C ++程序员可以帮助我:

问题1:从特定菜单QActions调用时,系统开始将对话框设置为动画,然后在绘制完全大小之前自动关闭它;返回码为-1000。对于其他特定操作,它始终可以正常工作。

问题2:我尝试禁用“标记”字段,但仍会显示在“小牛”上。如果我删除if语句,标签字段在Mavericks上隐藏,但程序在Lion上崩溃。

// Use native dialog to save a file
QString GetCocoaSaveFile(const QString &prompt, const QString &source_dir, const QString &filename)
{
  QString selected_file;

  NSSavePanel *panel = [NSSavePanel savePanel];
  [panel setFloatingPanel:YES];

  if([panel respondsToSelector:@selector(setShowsTagField)])  // Only available on 10.9+
    [panel setShowsTagField:NO];

  NSString *title_ns = [[NSString alloc]initWithUTF8String:prompt.toUtf8().data()];
  [panel setTitle:title_ns];

  NSString *path_ns = [[NSString alloc]initWithUTF8String:source_dir.toUtf8().data()];
  NSURL *directory_url = [[NSURL alloc]initFileURLWithPath:path_ns];
  [panel setDirectoryURL:directory_url];

  NSString *default_ns = nil;
  if(!filename.isEmpty())
  {
    default_ns = [[NSString alloc]initWithUTF8String:filename.toUtf8().data()];
    [panel setNameFieldStringValue:default_ns];
  }

  NSInteger result = [panel runModal];

  if(result == NSFileHandlingPanelOKButton)
  {
    NSURL *result_url = [panel URL];
    NSString *path_sel = [result_url path];
    selected_file = QString::fromUtf8([path_sel UTF8String]);
  }

  if(default_ns) [default_ns release];
  [directory_url release];
  [path_ns release];
  [title_ns release];

  return(selected_file);
}

如果相关,我正在使用Qt 5.2.0。

3 个答案:

答案 0 :(得分:2)

我也观察到问题#1(Qt 4.8.0)。 可以在显示对话框之前使用QApplication :: processEvents()来修复它。

QApplication::processEvents ();
NSInteger result = [panel runModal];

答案 1 :(得分:0)

你正在寻找这样的东西:

NSOpenPanel *panel = [NSOpenPanel openPanel]; // get an autorelease open panel
[panel setPrompt:NSLocalizedString(@"Open", @"Open")];
[panel setShowsTagField:OFF];                 // Turns off the tags
qApp->processEvent();                         // Gets Qt to play nice with the next line
NSInteger result = [panel runModal];

与Qt 5.2.0完美配合

答案 2 :(得分:0)

标记字段显示在Mavericks下的原因是以下行错误:

if([panel respondsToSelector:@selector(setShowsTagField)])

setShowsTagField接受一个参数,所以正确的选择器后面必须有一个冒号:

if([panel respondsToSelector:@selector(setShowsTagField:)])
                                                       ^

然后一切正常。

This question and answer让我意识到这就是问题。