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>='' && *chString<='') chString++; if (*chString)
{
bDigit = false;
}
else
{
bDigit = true;
} return bDigit;
}
2.查找自身最长重复子字符串
QString MaxSubString(QString inputString)
{
QString subString = "";
int strLen = inputString.size(); if (strLen <= )
{
return subString;
} int maxSubStrLen = ;
int tempLen = ;
int subIndex = ;
int i = ;
int j = ;
int k = ; while (i < strLen)
{
j = i+;
while(j < strLen)
{
if (inputString.at(i) == inputString.at(j))
{
tempLen = ;
for (k=; 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=; i<maxSubStrLen; i++)
{
subString.append(inputString.at(subIndex+i));
} return subString;
}
3.树形列表复选框操作
void CCheckBoxDialog::treeItemsChangeStol(QTreeWidgetItem *pCurrentItem, int)
{
if (m_itemsCount <= )//没有子节点,不存在选中操作
{
updateComboInfoStol();
return;
} if (Qt::Checked == pCurrentItem->checkState())
{
//QTreeWidgetItem *parentItem = pCurrentItem->parent(); int childCount = pCurrentItem->childCount();
if (childCount >)//父节点被选中
{
for (int i=; i<childCount; i++)
{
pCurrentItem->child(i)->setCheckState(, Qt::Checked);
}
}
else //更新父节点复选框状态
{
updateParentItemStateStol(pCurrentItem);
}
}
else if (Qt::Unchecked == pCurrentItem->checkState())
{
//QTreeWidgetItem *parentItem = pCurrentItem->parent(); int childCount = pCurrentItem->childCount();
if (childCount >)//父节点被选中
{
for (int i=; i<childCount; i++)
{
pCurrentItem->child(i)->setCheckState(, Qt::Unchecked);
}
}
else //更新父节点复选框状态
{
updateParentItemStateStol(pCurrentItem);
}
}
updateComboInfoStol();
}
void CCheckBoxDialog::updateParentItemStateStol(QTreeWidgetItem *pCurrentItem)
{
QTreeWidgetItem *parentItem = pCurrentItem->parent();
if (parentItem == NULL)
{
return;
} int selectedCount = ;//当前子节点选中个数
int childCount = parentItem->childCount();
for (int i=; i<childCount; i++)
{
QTreeWidgetItem *childItem = parentItem->child(i);
if (Qt::Checked == childItem->checkState())
{
selectedCount++;
}
} if (selectedCount <= )
{
//未选中任何项
parentItem->setCheckState(, Qt::Unchecked);
}
else if (selectedCount> && selectedCount<childCount)
{
//选中部分子项
parentItem->setCheckState(, Qt::PartiallyChecked);
}
else if (selectedCount == childCount)
{
//选中所有子项
parentItem->setCheckState(, 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 ;
} QStringList list1 = strVer1.split( "." );
QStringList list2 = strVer2.split( "." ); int iTotal1 = list1.count();
int iTotal2 = list2.count(); int iTotal=iTotal1>iTotal2?iTotal2:iTotal1; int iValue1 = , iValue2 = ;
bool ibOK1 = false, ibOK2 = false;
for ( int iNum = ; iNum < iTotal; ++iNum )
{
iValue1 = list1[iNum].toInt( &ibOK1 );
if (!ibOK1)
{
iValue1=;
} iValue2 = list2[iNum].toInt( &ibOK2 );
if (!ibOK2)
{
iValue2=;
} if (iValue1==iValue2)
{
continue;
}
else if ( iValue1 < iValue2 )
{
return -;
}
else
{
return ;
}
} return iTotal1<iTotal2?-:;
}
测试:
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;
Qt日常备注(函数/接口实现)的更多相关文章
- C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...
- Lambda函数接口和方法构造器应用
函数式接口 什么是函数式接口? 在java中'有且仅有一个抽象方法的接口',就称为函数式接口. 可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需要在目 ...
- Spring AOP在函数接口调用性能分析及其日志处理方面的应用
面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...
- IO端口和IO内存的区别及分别使用的函数接口
每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Po ...
- C语言的本质(16)——函数接口的传入参数与传出参数
如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...
- Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)
Qt窗口中的一些小技术总结 //Qt主窗口没有最小化,最大化按钮且最大化显示 int main(int argc, char *argv[]) { QApplication a(argc, argv ...
- 开始Java8之旅(四) --四大函数接口
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
随机推荐
- maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)
前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...
- spa单页面应用(angular)
本篇文章是对单页面的一个简单的基本逻辑操作,这个方法可以搭建基本的单页面的逻辑结构. 简单理解:单页面应用,锚点值切换,一个路由对应一个页面. 路由:此时会创建一个信息保存路由的信息,之后对页面a标签 ...
- win10 Internet Explorer 11 停止工作处理
win10 Internet Explorer 11 停止工作处理:
- JavaScript图片翻转
<script type="text/javascript"> /** * 注册函数f,当文档加载问成时执行这个函数f * 如果文件已经载入完成,尽快以异步方式执行它 ...
- 开发servlet三种方式
第一种:实现Servlet接口 ServletDemo类 实现Servlet接口 public class ServletDemo implements Servlet { //初始化该servlet ...
- Android项目导入工程Module
在Android开发过程中,我们经常引用一些模块,或者自己封装好的Project.在Android Studio某个项目是可以引入多个Module的.这样导入Module的好处方便对源码修改以适合自己 ...
- Webi Report 展示 图片链接 (Image Link)
最近由于项目需求,在生成的Webi Report中需要增加一列展示相关数据系统的图片链接,要求用户可以通过点击图片链接展示图片. 方法如下: 1,首先找到系统中图片,查看随机一张图片的属性,找到图片的 ...
- 小程序开发教程:wx.setTopBarText(OBJECT)
状态信息展示 当小程序被显示在聊天顶部时,开发者可将重要的状态变更信息实时展示出来,便于用户及时获知. 详见文档:小程序文档 小程序更新之后,有个更有用的功能!支持状态栏实时状态更新!! wx.set ...
- kevin的黎明十分
今天在搜索struts2的相关知识的时候,博客园让我提起了兴趣.其间看到了hongton同学的分享,感觉受益颇深!所以今天我加入了博客园,希望自己以后能在这个大家园中分享知识,收获人生! 即兴之下, ...
- python函数(1):初始函数
在学了前面很多python的基础类型后,我们终于可以进入下一阶段,今天我们将走进一个函数的新世界. 预习: 1.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 2.写函数, ...