我正在构建一个Windows程序,它应该具有64位数值的控件。这些控件应可切换为签名或未签名。
我找到了两个控件: “Spin Box”(int32)和“Double Spin Box”(双) 使用double我可以覆盖范围,但无法处理精度。
有没有办法更改这些控件的数据类型?
是否可以创建一个可以处理有符号和无符号64位值的控件? 是否可以创建一个128位的旋转盒?
我现在能看到的唯一解决方法是使用字符串控件并手动转换为INT64或UINT64,但我对此解决方案不是很满意
还有其他想法吗?
我使用QT 4.7.4和VS2010使用C ++ THX
答案 0 :(得分:7)
您可以派生QAbstractSpinBox
并至少重新实现虚拟函数stepBy
,stepEnabled
以及可能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):
你可以看到
<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 }},只需几分钟即可修改所需的部分。