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 ...
随机推荐
- Java Web - HTML 常用标签
1.HTML head, title, body 标签 其中 meta 中的keywords是为了快速的让搜索引擎找到 <html> <head> <title>这 ...
- Vsftpd3.0--FTP服务器搭建之本地用户篇
Vsftpd3.0--FTP服务器搭建之本地用户篇 年4月10日 19:23 FTP服务在工作中是经用到的一种工具,可以实现上传下载等功能.那么今天我们来聊一聊FTP服务器使用本地用户登录的实现模式. ...
- Android 上层应用读写设备节点
Android 上层应用读写设备节点 Android L [TOC] 1. Android 设备节点 Android基于Linux内核.设备节点文件是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动 ...
- 玩玩微信公众号Java版之六:微信网页授权
我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- [补] winpcap编程——EAPSOCKET实现校园网锐捷登录(mentohust)
EAP SOCKET Implement Mentohust 时间20161115 对于EAP协议不了解,可参考上一篇随笔. 通过抓包分析校园网的锐捷登录流程,我在上一篇随笔中实现了EAPSOCKET ...
- mysql内部级联删除
1,创建user表 属性:id,name 2,创建userInfo表 属性:id,age 在userInfo表中创建外键id,如下图: 在user表中插入两个用户信息 (1,'1'),(2,'2') ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- (转)springMVC框架下JQuery传递并解析Json数据
springMVC框架下JQuery传递并解析Json数据 json作为一种轻量级的数据交换格式,在前后台数据交换中占据着非常重要的地位.Json的语法非常简单,采用的是键值对表示形式.JSON 可以 ...
- (转)TCP和UDP之间的区别
TCP和UDP区别 TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠的 不可靠的 应用场合 传输大量的数据 少量数据 速度 慢 快 OSI 和 TCP/IP 模型在传输层 ...