Obj-C 实现 QFileDialog函数
Obj-C 实现 QFileDialog函数(getOpenFileName/getOpenFileNames/getExistingDirectory/getSaveFileName)
1.getOpenFileName
/************************************************************************** @QFileDialog::getOpenFileName @param pChDefFilePath:[input]Default file path @param pChFormat:[input]Save file format @param pChOpenFile:[output]Get the open file path @return: true, success; **************************************************************************/ bool MacGetOpenFileName(const char *pChDefFilePath, const char *pChFormat, char *pChOpenFile) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; bool bRet = false; NSOpenPanel *nsPanel = [NSOpenPanel openPanel]; [nsPanel setCanChooseFiles:YES]; [nsPanel setCanChooseDirectories:NO]; [nsPanel setAllowsMultipleSelection:NO]; NSString *nsDefFilePath = [[NSString alloc] initWithUTF8String: pChDefFilePath]; [nsPanel setDirectory:nsDefFilePath]; NSString *nsFormat = [[NSString alloc] initWithUTF8String: pChFormat]; if (0 != [nsFormat length]) { NSArray *nsFormatArray = [nsFormat componentsSeparatedByString:@","]; [nsPanel setAllowedFileTypes:nsFormatArray]; } memset(pChOpenFile, 0, 256); NSInteger nsResult = [nsPanel runModal]; if (nsResult!=NSFileHandlingPanelOKButton && nsResult!=NSFileHandlingPanelCancelButton) { //QTBUG:recall runModal when QMenu action triggered; [nsDefFilePath release]; nsDefFilePath = nil; [nsFormat release]; nsFormat = nil; [pool drain]; return MacGetOpenFileName(pChDefFilePath, pChFormat, pChOpenFile); } if (nsResult == NSFileHandlingPanelOKButton) { NSString *nsOpenFile = [[nsPanel URL] path]; const char *pChOpenFilePath = [nsOpenFile UTF8String]; while ((*pChOpenFile++ = *pChOpenFilePath++) != '\0'); bRet = true; } [nsDefFilePath release]; nsDefFilePath = nil; [nsFormat release]; nsFormat = nil; [pool drain]; return bRet; }
调用例子:
char chOpenFileName[256] = {0};//选择文件 if (MacGetOpenFileName(strDefFile.toStdString().c_str(), "txt,png", chOpenFileName))//多个后缀用“,”间隔,支持所有文件格式用“” { printf("Open file path=%s",chOpenFileName); }
2.getOpenFileNames
/************************************************************************** @QFileDialog::getOpenFileNames @param pChDefFilePath:[input]Default file path @param pChFormat:[input]Save file format @param vFileNameList:[output]Get the open file list @return: true, success; **************************************************************************/ bool MacGetOpenFileNames(const char *pChDefFilePath, const char *pChFormat, std::vector<std::string> &vFileNameList) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; bool bRet = false; NSOpenPanel *nsPanel = [NSOpenPanel openPanel]; [nsPanel setCanChooseFiles:YES]; [nsPanel setCanChooseDirectories:NO]; [nsPanel setAllowsMultipleSelection:YES]; NSString *nsDefFilePath = [[NSString alloc] initWithUTF8String: pChDefFilePath]; [nsPanel setDirectory:nsDefFilePath]; NSString *nsFormat = [[NSString alloc] initWithUTF8String: pChFormat]; if (0 != [nsFormat length]) { NSArray *nsFormatArray = [nsFormat componentsSeparatedByString:@","]; [nsPanel setAllowedFileTypes:nsFormatArray]; } vFileNameList.clear(); NSInteger nsResult = [nsPanel runModal]; if (nsResult!=NSFileHandlingPanelOKButton && nsResult!=NSFileHandlingPanelCancelButton) { //QTBUG:recall runModal when QMenu action triggered; [nsDefFilePath release]; nsDefFilePath = nil; [nsFormat release]; nsFormat = nil; [pool drain]; return MacGetOpenFileNames(pChDefFilePath, pChFormat, vFileNameList); } if (nsResult == NSFileHandlingPanelOKButton) { NSArray *nsSelectFileArray = [nsPanel URLs]; unsigned int iCount = [nsSelectFileArray count]; for (unsigned int i=0; i<iCount; i++) { std::string strSelectFile = [[[nsSelectFileArray objectAtIndex:i] path] UTF8String]; vFileNameList.push_back(strSelectFile); } if (iCount > 0) { bRet = true; } } [nsDefFilePath release]; [nsFormat release]; [pool drain]; return bRet; }
调用例子:
std::vector< std::string> vFileList;//选择文件列表 QString strDefFile;//默认文件路径 if (MacGetOpenFileNames(strDefFile.toStdString().c_str(), "txt,png", vFileList))//多个后缀用“,”间隔,支持所有文件格式“” { unsigned int iCount = vFileList.size(); for (unsigned int i=0; i<iCount; i++) { printf("Selected file[%i]=%s\n", i, vFileList.at(i).c_str()); } }
3.getExistingDirectory
/************************************************************************** @QFileDialog::getExistingDirectory @param pChFilePath:[input]Default select file path @param pChAgentNums: [output]Selected directory path @return: true, get directory path success; **************************************************************************/ bool MacGetExistDirectoryPath(const char *pChFilePath, char *pChSelectDir) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; bool bRet = false; NSOpenPanel *nsPanel = [NSOpenPanel openPanel]; [nsPanel setCanChooseFiles:NO]; [nsPanel setAllowsMultipleSelection:NO]; [nsPanel setCanChooseDirectories:YES]; NSString *nsStrFilePath = [[NSString alloc] initWithUTF8String:pChFilePath]; [nsPanel setDirectory:nsStrFilePath]; memset(pChSelectDir, 0, 256); NSInteger nsResult = [nsPanel runModal]; if (nsResult!=NSFileHandlingPanelOKButton && nsResult!=NSFileHandlingPanelCancelButton) { //QTBUG:recall runModal when QMenu action triggered; [nsStrFilePath release]; nsStrFilePath = nil; [pool drain]; return MacGetExistDirectoryPath(pChFilePath,pChSelectDir); } if (nsResult == NSFileHandlingPanelOKButton) { NSArray *nsSelectFiles = [nsPanel filenames]; if ([nsSelectFiles count] >= 1) { NSString *nsDirectoryPath = [nsSelectFiles objectAtIndex:0]; const char *pChDirectoryPath = [nsDirectoryPath UTF8String]; while ((*pChSelectDir++ = *pChDirectoryPath++) != '\0'); bRet = true; } } [nsStrFilePath release]; nsStrFilePath = nil; [pool drain]; return bRet; }
调用例子:
char chDirectory[256] = {0};//选择文件夹 QString strDefFile;//默认文件路径 if (MacGetExistDirectoryPath(strDefFile.toStdString().c_str(), chDirectory)) { printf("Selected diroctory=%s",chDirectory); }
4.getSaveFileName
/************************************************************************** @QFileDialog::getSaveFileName @param pChDefFilePath:[input]Default file path @param pChFormat:[input]Save file format @param pChSaveFile:[output]Get the save file path @return: true, success; **************************************************************************/ bool MacGetSaveFileName(const char *pChDefFilePath, const char *pChFormat, char *pChSaveFile) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; bool bRet = false; NSSavePanel *nsPanel = [NSSavePanel savePanel]; [nsPanel setCanCreateDirectories:YES]; NSString *nsDefFilePath = [[NSString alloc] initWithUTF8String: pChDefFilePath]; [nsPanel setDirectory:nsDefFilePath]; NSString *nsFormat = [[NSString alloc] initWithUTF8String: pChFormat]; if (0 != [nsFormat length]) { NSArray *nsFormatArray = [nsFormat componentsSeparatedByString:@","]; [nsPanel setAllowedFileTypes:nsFormatArray]; } memset(pChSaveFile, 0, 256); NSInteger nsResult = [nsPanel runModal]; if (nsResult!=NSFileHandlingPanelOKButton && nsResult!=NSFileHandlingPanelCancelButton) { //QTBUG:recall runModal when QMenu action triggered; [nsDefFilePath release]; nsDefFilePath = nil; [nsFormat release]; nsFormat = nil; [pool drain]; return MacGetSaveFileName(pChDefFilePath, pChFormat, pChSaveFile); } if (nsResult == NSFileHandlingPanelOKButton) { NSString *nsSaveFile = [[nsPanel URL] path]; const char *pChSaveFilePath = [nsSaveFile UTF8String]; while ((*pChSaveFile++ = *pChSaveFilePath++) != '\0'); bRet = true; } [nsDefFilePath release]; nsDefFilePath = nil; [nsFormat release]; nsFormat = nil; [pool drain]; return bRet; }
调用例子:
char chSaveFile[256] = {0};保存文件 QString strDefFile;//默认文件路径 if (MacGetSaveFileName(strDefFile.toStdString().c_str(), "txt,png", chSaveFile))//多个后缀用“,”间隔 { printf("Save file path=%s",chSaveFile); }
ps:本博文只用于日常备注及学习交流,请勿用于任何商业用途,涉及网摘等资料如有侵犯原作者权利,请联系确保及时更正!