QT中的64位int Spin Box

时间:2011-12-05 10:01:47

标签: c++ visual-studio-2010 qt 64-bit controls

我正在构建一个Windows程序,它应该具有64位数值的控件。这些控件应可切换为签名或未签名。

我找到了两个控件: “Spin Box”(int32)和“Double Spin Box”(双) 使用double我可以覆盖范围,但无法处理精度。

有没有办法更改这些控件的数据类型?

是否可以创建一个可以处理有符号和无符号64位值的控件? 是否可以创建一个128位的旋转盒?

我现在能看到的唯一解决方法是使用字符串控件并手动转换为INT64或UINT64,但我对此解决方案不是很满意

还有其他想法吗?

我使用QT 4.7.4和VS2010使用C ++ THX

4 个答案:

答案 0 :(得分:7)

您可以派生QAbstractSpinBox并至少重新实现虚拟函数stepBystepEnabled以及可能validate()fixup()以进行输入验证。

答案 1 :(得分:4)

我不使用fixup功能。查看我的СustomQSpinBox的代码。 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)
};

答案 2 :(得分:0)

在Qt Creator中使用自定义类(Widget):

  • 创建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文件中

在ui _ *。h生成文件中,你看到你上课了:

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

答案 3 :(得分:0)

仅出于完整性考虑:每次遇到这样的问题时,请记住(万一其他方法都失败了),您可以下载Qt源代码并制作自己的QSpinBox64或{{1 }},只需几分钟即可修改所需的部分。