8

入力として16進文字列のみを受け入れるQtウィジェットがあります。入力文字を[0-9A-Fa-f].ユーザーがバックスペース キーを 3 回押した後、表示させたいと思います。001122334400 11 22 33 4400 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])*"しかし、ユーザーが区切り文字としてスペースを入力する必要はありません。同様に、入力内容を編集するときは、スペースを暗黙的に管理する必要があります。

4

3 に答える 3

6

エヴァン、これを試してください:

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

inputMask は間隔を処理し、「h」はオプションの 16 進文字を表します (「H」はオプションではない文字を表します)。唯一の欠点: 最大入力長を事前に知っておく必要があります。上記の例では、4 バイトしか使用できません。

よろしく、ロビン

于 2010-05-04T15:04:55.080 に答える
1

3 つのアプローチを提案します。

のカーソルQLineEdit::keyPressEvent()に残された文字がスペースの場合、バックスラッシュを別の方法で処理するようにを再実装できます。QLineEditこのアプローチを使用すると、新しい文字が入力されたときにスペースを自動的に追加することもできます。

QLineEdit::textChanged()別のアプローチは、信号に接続された新しいスロットを作成することです。このシグナルは、テキストが変更されたときに発行されます。このスロットでは、必要に応じてスペースの作成と削除を処理できます。

QLineEdit最後に、メソッドを再実装するから派生した新しいクラスを作成できますQLineEdit::paintEvent()。このアプローチでは、QLineEditバッファーに格納されていない 16 進数の単語の間にスペースを表示できます。

于 2010-05-04T12:52:33.553 に答える