我正在QT Creator上构建C ++ GUI应用程序。 我将位置更改为葡萄牙语/巴西,现在只有逗号是小数点分隔符。
我需要QDoubleSpinBox作为小数分隔符点和逗号。 Officialy逗号是葡萄牙语中的分隔符,但某些键盘只在数字部分中有分数。
请帮忙,
答案 0 :(得分:0)
您可以继承QDoubleSpinBox
并重新实现validate
方法以接受点和逗号作为小数分隔符。我认为你可以通过在输入是一个句点时添加一个特殊的检查并允许它被接受(假设字符串中没有其他句号或逗号),但是否则调用基类实现。我还没有编译或测试过这个,但我认为这非常接近:
MyDoubleSpinBox::validate (QString &input, int &pos)
{
if (input == ".")
{
return (text ().contains (".") || text ().contains (",")) ? QValidator::Invalid : QValidator::Acceptable;
}
return QDoubleSpinBox::validate (input, pos);
}
答案 1 :(得分:0)
subClass QDoubleSpinBox并重新实现虚方法验证
完整解决方案:
<强> customSpinBox.h 强>
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QRegExpValidator>
#include <QDoubleSpinBox>
class CustomSpinBox : public QDoubleSpinBox {
Q_OBJECT
public:
explicit CustomSpinBox(QWidget* parent =0);
virtual QValidator::State validate(QString & text, int & pos) const;
private:
QRegExpValidator* validator;
};
#endif // WIDGET_H
<强> customSpinBox.cpp 强>
CustomSpinBox::CustomSpinBox(QWidget *parent):QDoubleSpinBox(parent),
validator(new QRegExpValidator(this))
{
validator->setRegExp(QRegExp("\\d{1,}(?:[,.]{1})\\d*"));
}
QValidator::State CustomSpinBox::validate(QString &text, int &pos) const
{
return validator->validate(text,pos);
}
答案 2 :(得分:0)
我尝试将解决方案从 basslo 转换为 Qt 6.0,但它无法接受整数。以下解决方案适用于 Qt 6.0
#pragma once
#include <qtWidgets>
class CRelaxedDoubleSpinBox : public QDoubleSpinBox {
Q_OBJECT
public:
explicit CRelaxedDoubleSpinBox(QWidget* parent =0) : QDoubleSpinBox(parent)
{
}
virtual QValidator::State validate(QString & text, int & pos) const
{
QString s = QString(text).replace(".", ",");
return QDoubleSpinBox::validate(s,pos);
}
double valueFromText(const QString& text) const
{
QString s = QString(text).replace(",", ".");
return s.toDouble();
}
};