QLineEdit должен принимать шестнадцатеричные значения в диапазоне от [0 - FFFFF] - PullRequest
1 голос
/ 18 октября 2019

У меня есть требование, где я хочу, чтобы мой QLineEdit принимал шестнадцатеричные значения в диапазоне от [0 - FFFFF]. Может ли кто-нибудь помочь мне с этим?

Я попробовал приведенный ниже код, но он подходит только для отображения с 1 символом.

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Я был неправ в своем комментарии о том, что документы Qt имеют пример Hex Spin Box ... поэтому я нашел его в своем архиве. Это может быть более гибким, но OTOH это очень просто и коротко. Я знаю, что это не QLineEdit, но, возможно, это все равно поможет. QValidator, использованный здесь, может использоваться и в редактировании строки.

enter image description here

#ifndef _HEXSPINBOX_H_
#define _HEXSPINBOX_H_

#include <QSpinBox>
#include <QRegularExpressionValidator>

// NOTE: Since QSpinBox uses int as the storage type, the effective editing range
//   is +/- 0x7FFF FFFF, so it can't handle a full unsigned int.  
// QDoubleSpinBox would be a more suitable base class if a wider range is needed.
class HexSpinBox : public QSpinBox
{
    Q_OBJECT

  public:
    HexSpinBox(QWidget *parent = nullptr, 
               bool showPrefix = false, 
               const QString &format = QStringLiteral("%x")) :
      QSpinBox(parent),
      format(format)
    {
      // Validates hex strings up to 8 chars with or w/out leading "0x" prefix.
      // For arbitrary prefix/suffix, the regex could be built dynamically
      //  in validate(), or override setPrefix()/setSuffix() methods.
      const QRegularExpression rx("(?:0[xX])?[0-9A-Fa-f]{1,8}");
      validator = new QRegularExpressionValidator(rx, this);
      setShowPrefix(showPrefix);
    }

  public slots:
    void setShowPrefix(bool show)
    {
      if (show)
        setPrefix(QStringLiteral("0x"));
      else
        setPrefix(QString());
    }

    void setFormat(const QString &text)
    {
      format = text;
      lineEdit()->setText(textFromValue(value()));
    }

  protected:
    QValidator::State validate(QString &text, int &pos) const override
    {
      return validator->validate(text, pos);
    }

    int valueFromText(const QString &text) const override
    {
      return text.toInt(0, 16);
    }

    QString textFromValue(int value) const override
    {
      return QString().sprintf(qPrintable(format), value);
    }

  private:
    QRegularExpressionValidator *validator;
    QString format;
};

#endif // _HEXSPINBOX_H_

Пример:

#include "HexSpinBox.h"
#include <QApplication>
#include <QBoxLayout>
#include <QDialog>
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  QDialog d;
  d.setLayout(new QVBoxLayout);

  HexSpinBox* sb = new HexSpinBox(&d);
  sb->setMaximum(0xFFFFF);
  sb->setValue(0x0A234);
  d.layout()->addWidget(sb);

  HexSpinBox* sb2 = new HexSpinBox(&d, true, QStringLiteral("%05X"));
  sb2->setMaximum(0xFFFFF);
  sb2->setValue(0x0A234);
  d.layout()->addWidget(sb2);

  return d.exec();
}
0 голосов
/ 19 октября 2019

Я не вижу кода в вашем посте, но вам нужен валидатор, производный от класса QValidator. Создайте подкласс, скажем, HexValidator, и реализуйте метод validate. Вы проверяете входную строку на наличие разрешенных символов и диапазона и возвращаете соответствующее состояние.

Затем вы назначаете валидатор для QLineEdit, используя метод QLineEdit :: setValidator. Обратите внимание, что QLineEdit не становится владельцем валидатора, поэтому вам нужно убедиться, что вы удалили его отдельно или предоставили родительский объект, чтобы он очищался при удалении родительского элемента. Вы можете создать один валидатор и назначить его нескольким полям, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...