• 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++) != '');
            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
    ", 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++) != '');
                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++) != '');
            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);
    }
  • 相关阅读:
    9.10 作业
    Day 03 作业
    Day02作业
    Day09 函数
    day08 简单习题
    Day04 python数据类型和词云的生成
    JAVA: 子类通过static块“覆盖”父类的成员变量风险
    JAVA: 子类“覆盖”父类的成员变量
    Java 访问控制权限
    Java数组类型转为集合类型
  • 原文地址:https://www.cnblogs.com/sz-leez/p/4314629.html
Copyright © 2020-2023  润新知