• Qt日常备注(函数/接口实现)


    1.判断QString是否为纯数字

    2.查找自身最长重复子字符串

    3.树形列表复选框操作

    4.更改文件权限

    5.判断系统64位

    6.文件生成md5值

    7.版本号比较(字符串比较)

    //-----实现-----

    1.判断QString是否为纯数字

    bool IsDigitString(QString strSource)
    {
        bool bDigit = false;
    
        if (strSource.isEmpty())
        {
            return bDigit;
        }
    
        QByteArray strByteArray = strSource.toLatin1();
        const char *chString = strByteArray.data();
    
        while (*chString && *chString>='0' && *chString<='9') chString++;
    
        if (*chString)
        {
            bDigit = false;
        }
        else
        {
            bDigit = true;
        }
    
        return bDigit;
    }

    2.查找自身最长重复子字符串

    QString MaxSubString(QString inputString)
    {
        QString subString = "";
        int strLen = inputString.size();
    
        if  (strLen  <=  0)
        {
            return subString;
        }
    
        int maxSubStrLen = 0;
        int tempLen = 0;
        int subIndex = 0;
        int i = 0;
        int j = 0;
        int k = 0;
    
        while (i <  strLen)
        {
            j = i+1;    
            while(j < strLen)
            {
                if  (inputString.at(i)  ==  inputString.at(j))
                {
                    tempLen = 1;
                    for (k=1;  j+k<strLen && inputString.at(i+k)==inputString.at(j+k);  k++)
                    {
                        tempLen++;
                    }
    
                    if  (tempLen  >  maxSubStrLen)
                    {
                        subIndex = i;
                        maxSubStrLen = tempLen;
                    }
    
                    j += tempLen;
                }
                else
                {
                       j++;
                }
            }
            i++;
        }
    
        for  (i=0;  i<maxSubStrLen;  i++)
        {
            subString.append(inputString.at(subIndex+i));
        }
    
        return subString;    
    }

     3.树形列表复选框操作

    void CCheckBoxDialog::treeItemsChangeStol(QTreeWidgetItem *pCurrentItem, int)
    {    
        if (m_itemsCount <= 0)//没有子节点,不存在选中操作
        {
            updateComboInfoStol();
            return;
        }
    
        if (Qt::Checked == pCurrentItem->checkState(0))
        {
            //QTreeWidgetItem *parentItem = pCurrentItem->parent();
    
            int childCount = pCurrentItem->childCount();
            if (childCount >0)//父节点被选中
            {
                for (int i=0; i<childCount; i++)
                {
                    pCurrentItem->child(i)->setCheckState(0, Qt::Checked);
                }
            }
            else    //更新父节点复选框状态
            {
                updateParentItemStateStol(pCurrentItem);
            }
        }
        else if (Qt::Unchecked == pCurrentItem->checkState(0))
        {
            //QTreeWidgetItem *parentItem = pCurrentItem->parent();
    
            int childCount = pCurrentItem->childCount();
            if (childCount >0)//父节点被选中
            {
                for (int i=0; i<childCount; i++)
                {
                    pCurrentItem->child(i)->setCheckState(0, Qt::Unchecked);
                }
            }
            else    //更新父节点复选框状态
            {
                updateParentItemStateStol(pCurrentItem);
            }
        }
        updateComboInfoStol();
    }
    void CCheckBoxDialog::updateParentItemStateStol(QTreeWidgetItem *pCurrentItem)
    {
        QTreeWidgetItem *parentItem = pCurrentItem->parent();
        if (parentItem == NULL)
        {
            return;
        }
    
        int selectedCount = 0;//当前子节点选中个数
        int childCount = parentItem->childCount();
        for (int i=0; i<childCount; i++)
        {
            QTreeWidgetItem *childItem = parentItem->child(i);
            if (Qt::Checked == childItem->checkState(0))
            {
                selectedCount++;
            }
        }
    
        if (selectedCount <= 0)
        {
            //未选中任何项
            parentItem->setCheckState(0, Qt::Unchecked);
        }
        else if (selectedCount>0 && selectedCount<childCount)
        {
            //选中部分子项
            parentItem->setCheckState(0, Qt::PartiallyChecked);
        }
        else if (selectedCount == childCount)
        {
            //选中所有子项
            parentItem->setCheckState(0, Qt::Checked);
        }
    }

     4.更改文件权限

    static void ChangeFilePermission( const QString &filePath )
    {
    #ifdef WIN32
        QString cmd("icacls.exe "") ;
        cmd += filePath;
        cmd += "" /grant Everyone:(F)";
        STARTUPINFOW si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
    
        #ifndef _DEBUG 
            si.dwFlags = STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_HIDE;
        #endif
    
        ZeroMemory(&pi, sizeof(pi));
        CreateProcessW (NULL,        // No module name (use command line). 
        (wchar_t*)cmd.utf16(),        // Command line. 
        NULL,                         // Process handle not inheritable. 
        NULL,                         // Thread handle not inheritable. 
        FALSE,                        // Set handle inheritance to FALSE. 
        0,                            // No creation flags. 
        NULL,                         // Use parent's environment block. 
        NULL,                         // Use parent's starting directory. 
        &si,                          // Pointer to STARTUPINFO structure.
        &pi);                         // Pointer to PROCESS_INFORMATION structure. 

      WaitForSingleObject(pi.hProcess, INFINITE);   CloseHandle(pi.hProcess);   CloseHandle(pi.hThread); #endif }

    5.判断系统64位

    static bool IsWin64 (void)
    {
        SYSTEM_INFO si = {0};
        typedef void (WINAPI *LPFN_PGNSI)(LPSYSTEM_INFO);
        LPFN_PGNSI pGNSI = (LPFN_PGNSI)GetProcAddress(GetModuleHandleA(("kernel32.dll")),"GetNativeSystemInfo");
    
        if (pGNSI) pGNSI(&si);
    
        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
        {
            return true;
        }
        return false;
    }

    6.文件生成md5值

    static bool GetFileMd5Code(const QString strFilePath, QString &strMD5Code)
    {
            bool bRet = false;
            strMD5Code = "";
    
            if (!QFile::exists(strFilePath))
            {
                qDebug() << strFilePath << " don't exist!";
                return bRet;
            }
    
            QFile file(strFilePath);
            if (file.open(QIODevice::ReadOnly))
            {
                QCryptographicHash cryptographicHash(QCryptographicHash::Md5);
                cryptographicHash.addData(&file);
                strMD5Code = QString::fromLatin1(cryptographicHash.result().toHex());
                file.close();
                bRet = true;
            }
    
            qDebug() << "md5:" << strMD5Code;
            return bRet;
        }
    
        qDebug() << "md5:" << strMD5Code;
        return bRet;
    }

    QByteArray块数据生成Md5

    QByteArray GetByteArrayMd5(const QByteArray &byteArrayData)
    { 
        return QCryptographicHash::hash(byteArrayData, QCryptographicHash::Md5).toHex();
    }

    7.版本号比较(字符串比较)

    int CompareVersion(QString strVer1, QString strVer2)
    {
        if ( !strVer1.compare( strVer2 ) )
        {
            return 0;
        }
    
        QStringList list1 = strVer1.split( "." );
        QStringList list2 = strVer2.split( "." );
    
        int iTotal1 = list1.count();
        int iTotal2 = list2.count();
    
        int iTotal=iTotal1>iTotal2?iTotal2:iTotal1;
    
        int iValue1 = 0, iValue2 = 0;
        bool ibOK1 = false, ibOK2 = false;
        for ( int iNum = 0; iNum < iTotal; ++iNum )
        {
            iValue1 = list1[iNum].toInt( &ibOK1 );
            if (!ibOK1)
            {
                iValue1=0;
            }
    
            iValue2 = list2[iNum].toInt( &ibOK2 );
            if (!ibOK2)
            {
                iValue2=0;
            }
    
            if (iValue1==iValue2)
            {
                continue;
            }
            else if ( iValue1 < iValue2 )
            {
                return -1;
            }
            else
            {
                return 1;
            }
        }
    
        return iTotal1<iTotal2?-1:1;
    }

    测试:

    CompareVersion("16.01.19", "16.01.19") //return 0;
    CompareVersion("16.01.19", "16.01.18") //return 1;
    CompareVersion("16.01.18", "16.01.19") //return -1;
  • 相关阅读:
    Eclipse中创建新的Spring Boot项目
    解决win下无法ping通VM虚拟机CentOS系统的方法
    32位centos下安装jdk1.7报Permission denied处理方式
    Windows下安装HBase
    15个nosql数据库
    查看软件的安装路径
    IP地址 网段的划分
    签名算法
    CentOS开启FTP及配置用户
    CentOS 5.5安装SVN(Subversion)
  • 原文地址:https://www.cnblogs.com/sz-leez/p/6537004.html
Copyright © 2020-2023  润新知