北京网站建设哪家比较好,android开发 wordpress,做钓鱼网站违法,做一个静态网站要多少钱问题
在实际开发中#xff0c;有时候需要对输入进行限制#xff0c;一是更加合理#xff0c;二是防止出现误操作。 比如#xff1a; 使用Qt进行应用程序开发时#xff0c;对单行编辑框QLineEdit控件#xff0c;设置只可输入十六进制。 限制输入的方式常用且经典的是使用…问题
在实际开发中有时候需要对输入进行限制一是更加合理二是防止出现误操作。 比如 使用Qt进行应用程序开发时对单行编辑框QLineEdit控件设置只可输入十六进制。 限制输入的方式常用且经典的是使用正则表达式。
示例1设置QLineEdit输入十六进制使用QRegExpValidator进行设置
设置QLineEdit只可输入十六进制且为了不产生歧义编辑框前两个字符为”0x” 包含头文件
#include QRegExp // 正则表达式类
#include QRegExpValidator // 验证器正则表达式
ui-lineEdit-setText(0x);ui-lineEdit-setValidator(new QRegExpValidator(QRegExp(^0x[0-9a-f]$
)));^0x[0-9a-f]$ 是一个正则表达式我们可以分步骤地解释它;至于没用到的就暂时不说不然容易混淆视听
^: 匹配字符串的开始。当此字符位于正则表达式的开始处时它确保模式必须从字符串的开始处匹配。0x: 这部分匹配字符串中的0x文字。 [0-9a-f]: 这是一个字符集它匹配任何一个在0到9或者a到f小写之间的字符。简单地说它匹配任何一个十六进制字符。: 表示前面的模式在这里是[0-9a-f]可以出现一次或多次。$: 匹配字符串的结束。当此字符位于正则表达式的末尾时它确保模式必须匹配到字符串的末尾。
因此整个正则表达式^[0-9a-f]$匹配的是一个完全由十六进制字符组成的字符串。这意味着如果一个字符串从开始到结束都是由十六进制字符组成的那么这个正则表达式就会匹配成功。 所以这个表达式刚好符合咱们的需求。 为了防止误删所以在QLineEdit的void textEdited(const QString text)的槽函数内添加 QString str arg1;if(str.left(2).compare(QLatin1String(0x)) ! 0){str QStringLiteral(0x);ui-lineEdit_4-setText(str);}这样确保编辑框前两位一直是”0x”。
示例2设置QLineEdit输入十六进制使用QRegularExpressionValidator进行设置
除了使用QRegExpValidator外还可以使用QRegularExpressionValidator 而且在Qt 5中新的qregulareexpression类提供了正则表达式的Perl兼容实现建议代替QRegExp。 ui-lineEdit-setText(0x);ui-lineEdit-setValidator(new QRegularExpressionValidator(QRegularExpression(^0x[0-9a-f]$)));限制输入位数
如限制只能输入3个十六进制位数
ui-lineEdit-setText(0x);ui-lineEdit-setValidator(new QRegularExpressionValidator(QRegularExpression(^0x[0-9a-f]{1,3}$)));^0x[0-9a-f]{1,3}$
^: 匹配字符串的开始。0x: 这部分匹配字符串中的0x文字。[0-9a-f]: 这是一个字符集它匹配任何一个在0到9或者a到f小写之间的字符。简单地说它匹配任何一个十六进制字符。{1,3}: 这是一个数量修饰符它表示前面的模式在这里是[0-9a-f]可以出现1到3次。$: 匹配字符串的结束。
^0x[0-9a-f]{1,3}$的意思是一个以0x开头并且其后紧跟1到3个十六进制字符的字符串。字符串以0x开始并且从0x之后开始有1到3个十六进制字符然后字符串结束那么这个正则表达式就会匹配成功。例如“0xa”、0x12和0x123都是与该正则表达式匹配的字符串但0x或0x1234则不匹配。
当输入位数不足时前面填充’0’
查询QString类帮助文档发现有两个成员方法符合需求 1.inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const; QString strArg ui-lineEdit-text().trimmed();QString str QString(%1).arg(strArg);str QString(0x%1).arg(str.toInt(0, 16), 3, 16, QChar(0));ui-lineEdit-setText(str);如输入
f输出就是
0x00f2.QString rightJustified(int width, QChar fill QLatin1Char( ), bool trunc false) const Q_REQUIRED_RESULT; 最后一个参数是如果truncate为false且字符串的size()大于width则返回的字符串是该字符串的副本。 如果truncate为true并且字符串的size()大于width则结果字符串将在位置width处被截断。 QString str QString(%1%2%3%4%5%6%7%8%9).arg(a, b, c, d, e, f, g, h, i);bool bTrunc false;str str.rightJustified(10, QChar(0), bTrunc);输出就是
0abcdefghi除了以上两种方式外哈可以自己判断进行填充。 QString str 0xfe;if(str.toInt(0, 16) 0x10){str QString(0x00%1).arg(QString::number(str.toInt(0, 16), 16));}else if(str.toInt(0, 16) 0x100){str QString(0x0%1).arg(QString::number(str.toInt(0, 16), 16));}else if(str.toInt(0, 16) 0x1000){str QString(0x%1).arg(QString::number(str.toInt(0, 16), 16));}qDebug().noquote() str : str; // 0x0fe每两位字符以空格隔开
当十六进制输入位数多时如abcdefg这样会显示拥挤没有ab cd ef g看起来整洁。 如何让每两个字符以空格隔开呢 提供以下4中方式
方式1进行位数判断每次都取两位进行空格填充 QString strArg ui-lineEdit-text().trimmed();// 填充QString str QString(0x%1).arg(strArg.toInt(0, 16), 3, 16, QChar(0));// 如0xaabbccdde 输出 0x aa bb cc dd eQString strSour str;// 替换掉空格strSour strSour.replace( , );QString strRes ; // 结果int strLen strSour.count();if(strSour.left(2).compare(QLatin1String(0x)) 0){if(strLen 2){// 判断奇偶if(0 strLen%2){// 取最后2位之前的子串for(int i 0; i strLen/2-1; i){QString strTmp strSour.mid(i*2, 2);strRes strTmp ;}// 加上的子串strRes strSour.right(2);}else{// 取最后1位之前的子串for(int i 0; i strLen/2-1; i){QString strTmp strSour.mid(i*2, 2);strRes strTmp ;}// 加上的子串strRes strSour.right(1); // 加上最后的一位}ui-lineEdit-setText(strRes);}}else{// send error}方式2优化方法一
去掉奇偶判断只判断最后一位或者两位代码立刻优雅起来。 QString strArg ui-lineEdit-text().trimmed();// 填充QString str QString(0x%1).arg(strArg.toInt(0, 16), 3, 16, QChar(0));// 如0xaabbccdde 输出 0x aa bb cc dd eQString strSour str;// 替换掉空格strSour strSour.replace( , );QString strRes ; // 结果int strLen strSour.count();if(strSour.left(2).compare(QLatin1String(0x)) 0){if(strLen 2){for(int i 0; i strLen/2-1; i){QString strTmp strSour.mid(i*2, 2);strRes strTmp ;}// 根据奇偶加上最后的1或者2位strRes strSour.right(strLen%2 0 ? 2 : 1);ui-lineEdit-setText(strRes);}}else{// send error}方式3使用while循环 QString strArg ui-lineEdit-text().trimmed(); // aabbc// 填充QString str QString(0x%1).arg(strArg.toInt(0, 16), 3, 16, QChar(0)); // 0xaabbcstr str.replace( , );int nLen str.length();int nIndex 0;while( 2*(nIndex1) nLen ){str.insert(2*(nIndex1), );nIndex;}ui-lineEdit-setText(str); // 0x aa bb c方式4使用正则表达式推荐 QString strArg ui-lineEdit-text().trimmed();// 填充QString str QString(0x%1).arg(strArg.toInt(0, 16), 3, 16, QChar(0));str str.replace( , ); // 0xaabbccddeQRegExp regex((.{2})); // 正则表达式匹配任意两个字符// 使用正则表达式进行替换操作将匹配到的两个字符之间添加空格QString result str.replace(regex, \\1 );ui-lineEdit-setText(result); // 0x aa bb cc dd e结论
一个人如果没有梦想跟无忧无虑有什么区别。