入力として16進文字列のみを受け入れるQtウィジェットがあります。入力文字を[0-9A-Fa-f]
.ユーザーがバックスペース キーを 3 回押した後、表示させたいと思います。0011223344
00 11 22 33 44
00 11 22 3
私はほとんど欲しいものを持っていますが、これまでのところ、delete キーを使用して区切り記号を削除することに関連する微妙なバグが 1 つだけあります。このバリデータを実装するより良い方法はありますか? これまでの私のコードは次のとおりです。
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% 期待どおりに動作することを望んでいます。明らかに理想は、16進文字列の表示を の内部バッファに格納されている実際の文字から分離することですが、QLineEdit
どこから始めればよいかわかりません。
本質的に、この正規表現に準拠するバリデーターが必要です。"[0-9A-Fa-f]( [0-9A-Fa-f])*"
しかし、ユーザーが区切り文字としてスペースを入力する必要はありません。同様に、入力内容を編集するときは、スペースを暗黙的に管理する必要があります。