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 ...
随机推荐
- AppDelegate减负之常用三方封装 - 友盟分享 / 三方登录篇
之前完成了 AppDelegate减负之常用三方封装 - 友盟推送篇: http://www.cnblogs.com/zhouxihi/p/7113511.html 今天接着来完成 - 友盟分享和三方 ...
- MySQL常用基本命令
启动MySQL /etc/init.d/mysqld start 优雅的关闭数据库的方法 1:使用MySQLadmin mysqladmin -uroot -p123456 shutdown 2:使用 ...
- Django学习(一)---基本配置及创建项目、应用
安装:在Django官网下载最新版Django然后通过pip安装即可 一.创建项目 进入文件夹,打开cmd窗口,输入django-admin startproject myblog(项目名) 二.创建 ...
- Luogu 1402 酒店之王(二分图最大匹配)
Luogu 1402 酒店之王(二分图最大匹配) Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自 ...
- 或许你不知道的10条SQL技巧(转自58沈剑原创)
这几天在写索引,想到一些有意思的TIPS,希望大家有收获. 一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and s ...
- python中的模块,以及包的导入的总结
模块导入的方式: 模块的概念:一个.py文件就称为一个模块 导入模块中函数的方式: 方式一:import 模块名 使用时:模块名.函数名() 方式二 :from 模块名 import 函数名 使用 ...
- Java开源博客My-Blog(SpringBoot+Docker)系列文章
My Blog 1.Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦 2.My-Blog搭建过程:如何让一个网站从零到可以上线访问 3.将数据的初始化放到 ...
- 运行shell脚本时报错"[[ : not found"解决方法
问题描述 在运行shell脚本时报错,命令为: sh test.sh 报错如图: 脚本代码如下: #!/bin/bash # file:test.sh # author:13 # date:2017- ...
- 【SpringMVC】静态资源访问的问题
在项目中经常会用到一些静态的资源,而一般我们在配置SpringMVC时会让SpringMVC接管所有的请求(包括静态资源的访问), 那么我们怎样才能最简单的来配置静态资源的访问呢? 一,在web.xm ...
- java基础系列--集合类库(一)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7229478.html 1.概述 Java的集合类库很是丰富,囊括了大部分的常见数据结构形式 ...