我有一個Qt小部件應該只接受一個十六進制字符串作爲輸入。將輸入字符限制爲[0-9A-Fa-f]
非常簡單,但我希望在「字節」之間顯示分隔符,例如,如果分隔符是空格,並且用戶類型0011223344
我希望行編輯顯示00 11 22 33 44
現在,如果用戶按下退格鍵3次,那麼我希望它顯示00 11 22 3
。QValidator十六進制輸入
我差不多有我想要的,到目前爲止只有一個微妙的錯誤,涉及使用刪除鍵刪除分隔符。有沒有人有更好的方法來實現這個驗證器?這裏是我的代碼到目前爲止:
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
內部緩衝區中的實際字符分開顯示,但我不知道從哪裏開始,我認爲這是一項不重要的任務。
從本質上講,我想有一個符合此正則表達式的Validator:"[0-9A-Fa-f]([0-9A-Fa-f])*"
,但我不希望用戶必須鍵入空格作爲分隔符。同樣,編輯它們所鍵入的內容時,空間應該被隱式管理。
我認爲,第三方法是最佳的,你見過這樣的代碼示例任何機會呢? – 2010-05-04 14:45:40
你可以看看http://websvn.kde.org/trunk/KDE/kdeutils/okteta/parts/kbytesedit/,它似乎是相關的(但更復雜)。 – Lohrun 2010-05-04 18:51:05