64bit Int Spin Box в QT - PullRequest
       19

64bit Int Spin Box в QT

6 голосов
/ 05 декабря 2011

Я создаю программу Windows, которая должна иметь элементы управления для 64-битных числовых значений.эти элементы управления должны быть переключаемыми, чтобы быть подписанными или неподписанными.

Я нашел два элемента управления: «Spin Box» (int32) и «Double Spin Box» (double) с двойной, я мог бы покрыть диапазон, ноон не может обработать точность.

Есть ли способ изменить тип данных этих элементов управления?

Можно ли создать собственный элемент управления, который может обрабатывать 64-битные значения со знаком и без знака?Можно ли создать 128-битный Spin-бокс?

Единственный выход, который я сейчас вижу, заключается в использовании строкового элемента управления и ручного преобразования в INT64 или UINT64, но я не очень доволен этим решением

Любые другие идеи?

Я на QT 4.7.4 и VS2010 с C ++ thx

Ответы [ 3 ]

7 голосов
/ 05 декабря 2011

Вы можете получить QAbstractSpinBox и переопределить, по крайней мере, виртуальные функции stepBy, stepEnabled и, возможно, validate() и fixup() для проверки ввода.

4 голосов
/ 17 сентября 2015

Я не использую функцию исправления. Смотрите код моего Сustom QSpinBox. класс QLongLongSpinBox, полученный из QAbstractSpinBox

Не забудьте позвонить

setMaximum(std::numeric_limits<qlonglong>::max());
setMinimum(std::numeric_limits<qlonglong>::min());

после создания QLongLongSpinBox.

см. Файл qlonglongspinbox.h:

#include <QtWidgets/QWidget>
#include <QtWidgets/QAbstractSpinBox>
#include <QtWidgets/QLineEdit>

class QLongLongSpinBoxPrivate;
class Q_WIDGETS_EXPORT QLongLongSpinBox : public QAbstractSpinBox
{
    Q_OBJECT

    Q_PROPERTY(qlonglong minimum READ minimum WRITE setMinimum)
    Q_PROPERTY(qlonglong maximum READ maximum WRITE setMaximum)

    Q_PROPERTY(qlonglong value READ value WRITE setValue NOTIFY valueChanged USER true)


    qlonglong m_minimum;
    qlonglong m_maximum;
    qlonglong m_value;

public:
    explicit QLongLongSpinBox(QWidget *parent = 0)
    {
        connect(lineEdit(), SIGNAL(textEdited(QString)), this, SLOT(onEditFinished()));
    };
    ~QLongLongSpinBox() {};

    qlonglong value() const
    {
        return m_value;
    };

    qlonglong minimum() const
    {
        return m_minimum;
    };

    void setMinimum(qlonglong min)
    {
        m_minimum = min;
    }

    qlonglong maximum() const
    {
        return m_maximum;
    };

    void setMaximum(qlonglong max)
    {
        m_maximum = max;
    }

    void setRange(qlonglong min, qlonglong max)
    {
        setMinimum(min);
        setMaximum(max);
    }

    virtual void stepBy(int steps)
    {
        auto new_value = m_value;
        if (steps < 0 && new_value + steps > new_value) {
            new_value = std::numeric_limits<qlonglong>::min();
        }
        else if (steps > 0 && new_value + steps < new_value) {
            new_value = std::numeric_limits<qlonglong>::max();
        }
        else {
            new_value += steps;
        }

        lineEdit()->setText(textFromValue(new_value));
        setValue(new_value);
    }

protected:
    //bool event(QEvent *event);
    virtual QValidator::State validate(QString &input, int &pos) const
    {
        bool ok;
        qlonglong val = input.toLongLong(&ok);
        if (!ok)
            return QValidator::Invalid;

        if (val < m_minimum || val > m_maximum)
            return QValidator::Invalid;

        return QValidator::Acceptable;
    }

    virtual qlonglong valueFromText(const QString &text) const
    {
        return text.toLongLong();
    }

    virtual QString textFromValue(qlonglong val) const
    {
        return QString::number(val);
    }
    //virtual void fixup(QString &str) const;

    virtual QAbstractSpinBox::StepEnabled stepEnabled() const
    {
        return StepUpEnabled | StepDownEnabled;
    }


public Q_SLOTS:
    void setValue(qlonglong val)
    {
        if (m_value != val) {
            lineEdit()->setText(textFromValue(val));
            m_value = val;
        }
    }

    void onEditFinished()
    {
        QString input = lineEdit()->text();
        int pos = 0;
        if (QValidator::Acceptable == validate(input, pos))
            setValue(valueFromText(input));
        else
            lineEdit()->setText(textFromValue(m_value));
    }

Q_SIGNALS:
    void valueChanged(qlonglong v);

private:
    Q_DISABLE_COPY(QLongLongSpinBox)

    Q_DECLARE_PRIVATE(QLongLongSpinBox)
};
0 голосов
/ 17 сентября 2015

Чтобы использовать свой пользовательский класс (Widget), его в Qt Creator:

  • создать виджет QWidget
  • Элемент списка
  • выбрать Повышение до .. в меню виджетовНовый повышенный класс: QWigdet
    Имя повышенного класса QLongLongSpinBox
    Заголовочный файл: запись qlonglongspinbox.h
    Повышение
  • выбор Повышение до QLongLongSpinBox
  • сохранение

Вы можете видеть

<item>
    <widget class="QLongLongSpinBox" name="value_integer" native="true"/>
</item>

и:

<customwidgets>
  <customwidget>
   <class>QLongLongSpinBox</class>
   <extends>QWidget</extends>
   <header>qlonglongspinbox.h</header>
   <container>1</container>
  </customwidget>
</customwidgets>

в * .ui файле

в пользовательском интерфейсе _ *. H создавая файл, который вы видите, класс:

#include "qlonglongspinbox.h"
QLongLongSpinBox *object_name;
value_integer = new QLongLongSpinBox(YourWidgetName);
value_integer->setObjectName(QStringLiteral("value_integer"));
verticalLayout->addWidget(value_integer);
...