用于十六进制输入的QValidator

Eva*_*ran 7 c++ qt qlineedit

我有一个Qt小部件,它只接受十六进制字符串作为输入.将输入字符限制为非常简单[0-9A-Fa-f],但我想让它显示"bytes"之间的分隔符,例如,如果分隔符是空格,而用户类型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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

本质上,我想有一个符合这个正则表达式的Validator:"[0-9A-Fa-f]( [0-9A-Fa-f])*"但我不希望用户必须输入一个空格作为分隔符.同样,在编辑它们键入的内容时,应该隐式管理这些空格.

Rob*_*bin 6

埃文,试试这个:

QLineEdit * edt = new QLineEdit( this );  
edt->setInputMask( "Hh hh hh hh" );
Run Code Online (Sandbox Code Playgroud)

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

最好的问候,罗宾


Loh*_*run 1

我将提出三种方法:

QLineEdit::keyPressEvent()当 的光标左边的字符QLineEdit是空格时,您可以重新实现 来以不同的方式处理反斜杠。使用这种方法,您还可以在键入新字符时自动添加空格。

另一种方法是创建一个新插槽,连接到QLineEdit::textChanged()信号。当文本更改时会发出此信号。在此槽中,您可以根据需要处理空间的创建和删除。

最后,您可以创建一个派生的新类,重新QLineEdit实现该QLineEdit::paintEvent()方法。通过这种方法,您可以显示未存储在QLineEdit缓冲区中的十六进制字之间的空格。