gpt4 book ai didi

c++ - 十六进制输入的 QValidator

转载 作者:可可西里 更新时间:2023-11-01 18:30:06 26 4
gpt4 key购买 nike

我有一个 Qt 小部件,它应该只接受一个十六进制字符串作为输入。将输入字符限制为 [0-9A-Fa-f] 非常简单,但我想让它在“字节”之间显示一个分隔符,例如,如果分隔符是空格,然后用户键入 0011223344 我希望行编辑显示 00 11 22 33 44 现在如果用户按退格键 3 次,那么我希望它显示 00 11 22 3

几乎得到了我想要的东西,到目前为止,只有一个细微的错误涉及使用删除键删除定界符。有没有人有更好的方法来实现这个验证器?到目前为止,这是我的代码:

class HexStringValidator : public QValidator {
public:
HexStringValidator(QObject * parent) : QValidator(parent) {}

public:
virtual void fixup(QString &input) const {
QString temp;
int index = 0;

// every 2 digits insert a space if they didn't explicitly type one
Q_FOREACH(QChar ch, input) {
if(std::isxdigit(ch.toAscii())) {

if(index != 0 && (index & 1) == 0) {
temp += ' ';
}

temp += ch.toUpper();
++index;
}
}

input = temp;
}

virtual State validate(QString &input, int &pos) const {
if(!input.isEmpty()) {
// TODO: can we detect if the char which was JUST deleted
// (if any was deleted) was a space? and special case this?
// as to not have the bug in this case?

const int char_pos = pos - input.left(pos).count(' ');
int chars = 0;
fixup(input);

pos = 0;

while(chars != char_pos) {
if(input[pos] != ' ') {
++chars;
}
++pos;
}

// favor the right side of a space
if(input[pos] == ' ') {
++pos;
}
}
return QValidator::Acceptable;
}
};

目前这段代码的功能已经足够了,但我希望它能按预期 100% 工作。显然,理想的做法是将十六进制字符串的显示与 QLineEdit 的内部缓冲区中存储的实际字符分开,但我不知道从哪里开始,我想这是一个非琐碎的任务。

本质上,我想要一个符合此正则表达式的验证器:"[0-9A-Fa-f]( [0-9A-Fa-f])*" 但是我不希望用户必须键入空格作为分隔符。同样,在编辑他们键入的内容时,应隐式管理空格。

最佳答案

埃文,试试这个:

QLineEdit * edt = new QLineEdit( this );  
edt->setInputMask( "Hh hh hh hh" );

inputMask 负责间距,“h”代表可选的十六进制字符(“H”代表非可选字符)。唯一的缺点:您必须事先知道最大输入长度。我上面的例子只允许四个字节。

最好的问候,罗宾

关于c++ - 十六进制输入的 QValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com