1.判断QString是否为纯数字

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

3.树形列表复选框操作

4.更改文件权限

5.判断系统64位

6.文件生成md5值

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

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

1.判断QString是否为纯数字

  1. bool IsDigitString(QString strSource)
  2. {
  3. bool bDigit = false;
  4.  
  5. if (strSource.isEmpty())
  6. {
  7. return bDigit;
  8. }
  9.  
  10. QByteArray strByteArray = strSource.toLatin1();
  11. const char *chString = strByteArray.data();
  12.  
  13. while (*chString && *chString>='' && *chString<='') chString++;
  14.  
  15. if (*chString)
  16. {
  17. bDigit = false;
  18. }
  19. else
  20. {
  21. bDigit = true;
  22. }
  23.  
  24. return bDigit;
  25. }

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

  1. QString MaxSubString(QString inputString)
  2. {
  3. QString subString = "";
  4. int strLen = inputString.size();
  5.  
  6. if (strLen <= )
  7. {
  8. return subString;
  9. }
  10.  
  11. int maxSubStrLen = ;
  12. int tempLen = ;
  13. int subIndex = ;
  14. int i = ;
  15. int j = ;
  16. int k = ;
  17.  
  18. while (i < strLen)
  19. {
  20. j = i+;
  21. while(j < strLen)
  22. {
  23. if (inputString.at(i) == inputString.at(j))
  24. {
  25. tempLen = ;
  26. for (k=; j+k<strLen && inputString.at(i+k)==inputString.at(j+k); k++)
  27. {
  28. tempLen++;
  29. }
  30.  
  31. if (tempLen > maxSubStrLen)
  32. {
  33. subIndex = i;
  34. maxSubStrLen = tempLen;
  35. }
  36.  
  37. j += tempLen;
  38. }
  39. else
  40. {
  41. j++;
  42. }
  43. }
  44. i++;
  45. }
  46.  
  47. for (i=; i<maxSubStrLen; i++)
  48. {
  49. subString.append(inputString.at(subIndex+i));
  50. }
  51.  
  52. return subString;
  53. }

3.树形列表复选框操作

  1. void CCheckBoxDialog::treeItemsChangeStol(QTreeWidgetItem *pCurrentItem, int)
  2. {
  3. if (m_itemsCount <= )//没有子节点,不存在选中操作
  4. {
  5. updateComboInfoStol();
  6. return;
  7. }
  8.  
  9. if (Qt::Checked == pCurrentItem->checkState())
  10. {
  11. //QTreeWidgetItem *parentItem = pCurrentItem->parent();
  12.  
  13. int childCount = pCurrentItem->childCount();
  14. if (childCount >)//父节点被选中
  15. {
  16. for (int i=; i<childCount; i++)
  17. {
  18. pCurrentItem->child(i)->setCheckState(, Qt::Checked);
  19. }
  20. }
  21. else //更新父节点复选框状态
  22. {
  23. updateParentItemStateStol(pCurrentItem);
  24. }
  25. }
  26. else if (Qt::Unchecked == pCurrentItem->checkState())
  27. {
  28. //QTreeWidgetItem *parentItem = pCurrentItem->parent();
  29.  
  30. int childCount = pCurrentItem->childCount();
  31. if (childCount >)//父节点被选中
  32. {
  33. for (int i=; i<childCount; i++)
  34. {
  35. pCurrentItem->child(i)->setCheckState(, Qt::Unchecked);
  36. }
  37. }
  38. else //更新父节点复选框状态
  39. {
  40. updateParentItemStateStol(pCurrentItem);
  41. }
  42. }
  43. updateComboInfoStol();
  44. }
  1. void CCheckBoxDialog::updateParentItemStateStol(QTreeWidgetItem *pCurrentItem)
  2. {
  3. QTreeWidgetItem *parentItem = pCurrentItem->parent();
  4. if (parentItem == NULL)
  5. {
  6. return;
  7. }
  8.  
  9. int selectedCount = ;//当前子节点选中个数
  10. int childCount = parentItem->childCount();
  11. for (int i=; i<childCount; i++)
  12. {
  13. QTreeWidgetItem *childItem = parentItem->child(i);
  14. if (Qt::Checked == childItem->checkState())
  15. {
  16. selectedCount++;
  17. }
  18. }
  19.  
  20. if (selectedCount <= )
  21. {
  22. //未选中任何项
  23. parentItem->setCheckState(, Qt::Unchecked);
  24. }
  25. else if (selectedCount> && selectedCount<childCount)
  26. {
  27. //选中部分子项
  28. parentItem->setCheckState(, Qt::PartiallyChecked);
  29. }
  30. else if (selectedCount == childCount)
  31. {
  32. //选中所有子项
  33. parentItem->setCheckState(, Qt::Checked);
  34. }
  35. }

4.更改文件权限

  1. static void ChangeFilePermission( const QString &filePath )
  2. {
  3. #ifdef WIN32
  4. QString cmd("icacls.exe \"") ;
  5. cmd += filePath;
  6. cmd += "\" /grant Everyone:(F)";
  7. STARTUPINFOW si;
  8. PROCESS_INFORMATION pi;
  9. ZeroMemory(&si, sizeof(si));
  10. si.cb = sizeof(si);
  11.  
  12. #ifndef _DEBUG
  13. si.dwFlags = STARTF_USESHOWWINDOW;
  14. si.wShowWindow = SW_HIDE;
  15. #endif
  16.  
  17. ZeroMemory(&pi, sizeof(pi));
  18. CreateProcessW (NULL,       // No module name (use command line).
  19.     (wchar_t*)cmd.utf16(), // Command line.
  20.     NULL, // Process handle not inheritable.
  21.     NULL, // Thread handle not inheritable.
  22.     FALSE, // Set handle inheritance to FALSE.
  23.     0, // No creation flags.
  24.     NULL, // Use parent's environment block.
  25.     NULL, // Use parent's starting directory.
  26.     &si, // Pointer to STARTUPINFO structure.
  27.     &pi); // Pointer to PROCESS_INFORMATION structure.
  28.  
  29.   WaitForSingleObject(pi.hProcess, INFINITE);
  30.   CloseHandle(pi.hProcess);
  31.   CloseHandle(pi.hThread);
  32. #endif
  33. }

5.判断系统64位

  1. static bool IsWin64 (void)
  2. {
  3. SYSTEM_INFO si = {0};
  4. typedef void (WINAPI *LPFN_PGNSI)(LPSYSTEM_INFO);
  5. LPFN_PGNSI pGNSI = (LPFN_PGNSI)GetProcAddress(GetModuleHandleA(("kernel32.dll")),"GetNativeSystemInfo");
  6.  
  7. if (pGNSI) pGNSI(&si);
  8.  
  9. if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
  10. {
  11. return true;
  12. }
  13. return false;
  14. }

6.文件生成md5值

  1. static bool GetFileMd5Code(const QString strFilePath, QString &strMD5Code)
  2. {
  3. bool bRet = false;
  4. strMD5Code = "";
  5.  
  6. if (!QFile::exists(strFilePath))
  7. {
  8. qDebug() << strFilePath << " don't exist!";
  9. return bRet;
  10. }
  11.  
  12. QFile file(strFilePath);
  13. if (file.open(QIODevice::ReadOnly))
  14. {
  15. QCryptographicHash cryptographicHash(QCryptographicHash::Md5);
  16. cryptographicHash.addData(&file);
  17. strMD5Code = QString::fromLatin1(cryptographicHash.result().toHex());
  18. file.close();
  19. bRet = true;
  20. }
  21.  
  22. qDebug() << "md5:" << strMD5Code;
  23. return bRet;
  24. }
  25.  
  26. qDebug() << "md5:" << strMD5Code;
  27. return bRet;
  28. }

QByteArray块数据生成Md5

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

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

  1. int CompareVersion(QString strVer1, QString strVer2)
  2. {
  3. if ( !strVer1.compare( strVer2 ) )
  4. {
  5. return ;
  6. }
  7.  
  8. QStringList list1 = strVer1.split( "." );
  9. QStringList list2 = strVer2.split( "." );
  10.  
  11. int iTotal1 = list1.count();
  12. int iTotal2 = list2.count();
  13.  
  14. int iTotal=iTotal1>iTotal2?iTotal2:iTotal1;
  15.  
  16. int iValue1 = , iValue2 = ;
  17. bool ibOK1 = false, ibOK2 = false;
  18. for ( int iNum = ; iNum < iTotal; ++iNum )
  19. {
  20. iValue1 = list1[iNum].toInt( &ibOK1 );
  21. if (!ibOK1)
  22. {
  23. iValue1=;
  24. }
  25.  
  26. iValue2 = list2[iNum].toInt( &ibOK2 );
  27. if (!ibOK2)
  28. {
  29. iValue2=;
  30. }
  31.  
  32. if (iValue1==iValue2)
  33. {
  34. continue;
  35. }
  36. else if ( iValue1 < iValue2 )
  37. {
  38. return -;
  39. }
  40. else
  41. {
  42. return ;
  43. }
  44. }
  45.  
  46. return iTotal1<iTotal2?-:;
  47. }

测试:

  1. CompareVersion("16.01.19", "16.01.19") //return 0;
  2. CompareVersion("16.01.19", "16.01.18") //return 1;
  3. CompareVersion("16.01.18", "16.01.19") //return -1;

Qt日常备注(函数/接口实现)的更多相关文章

  1. C语言的本质(15)——C语言的函数接口入门

    C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...

  2. Lambda函数接口和方法构造器应用

    函数式接口 什么是函数式接口? 在java中'有且仅有一个抽象方法的接口',就称为函数式接口. 可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需要在目 ...

  3. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  4. IO端口和IO内存的区别及分别使用的函数接口

    每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Po ...

  5. C语言的本质(16)——函数接口的传入参数与传出参数

    如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...

  6. Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)

    Qt窗口中的一些小技术总结 //Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[]) { QApplication a(argc, argv ...

  7. 开始Java8之旅(四) --四大函数接口

    前言   Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词   在学习 ...

  8. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  9. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

随机推荐

  1. Elasticsearch学习随笔(一)--原理理解与5.0核心插件部署过程

    最近由于要涉及一些安全运维的工作,最近在研究Elasticsearch,为ELK做相关的准备.于是把自己学习的一些随笔分享给大家,进行学习,在部署常用插件的时候由于是5.0版本的Elasticsear ...

  2. Educational Codeforces Round 22.B 暴力

    B. The Golden Age time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. Linux 密钥验证

    服务端配置puttygen 生成公钥,保存私钥复制公钥,写入服务端mkdir /root/.sshvi /root/.ssh/authorized_keys 生成文件,将公钥写入到文件中chmod 7 ...

  4. 使用Jenkins进行持续集成ionic3项目

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.  网上大多数是关于.net web网站以及 ...

  5. Java IO在实际开发中的应用

    IO是java绕不过去的槛,在开发中io无处不在, 正如同 世界上本没有路,java io写多了,也就知道了大体是什么意思,在读完thinking in java 感觉就更清晰了,结合具体的业务场景, ...

  6. .NetCore~C#6的一些新特性

    回到目录 在进行.netCore平台后,由于它的版本在.net4.6,C#6之后,所以它的语法也有一些新的特性,主要表现在以下几个方面 只读属性初始化 static string Hello => ...

  7. Vulkan Tutorial 28 Depth buffering

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,我们所使用的几何图形为3D,但仍然完全扁平的. ...

  8. 剖析touch事件在View中的传递

    话不多说,直奔主题,先来看一张图 版权申明:这是csdn上别人的图,我觉得有用,就拿过来了, 然后简单说明下: 总的来说,触摸事件是从最外层的ViewGroup,一级一级传递进来的 和这相关的每个Vi ...

  9. 使用ajax方法实现form表单的提交(附源码)

    写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...

  10. PHP中json_encode与json_decode

    一.json_encode() 对变量进行JSON编码, 语法: json_encode ( $value [, $options = 0 ] ) 注意:1.$value为要编码的值,且该函数只对UT ...