データ・タイプを制限するにQLineEdit - 浮動小数点数のみを入力することができ

序文

最近、小型PCを作った、不要なトラブルが生じ、誤入力を防ぐために、シリアルポートのパラメータを数回発行されるように、私が入れ浮動小数点データ0から680まで、サポート小数点以下2桁の入力範囲を制限ビット。入力の種類を制限する方法にQLineEditをご覧ください。送信されたときに、関数を書きたかった、次のパラメータは、文字列パラメータがにQLineEditに渡され、その後、有効か否かを判断し、有効でない場合は、何のパラメータは発行されず、その後、ユーザの確認を変更します。これも達成やってますが、非常に強力のQtをしたいと思い、あなたは私たちは単純に見つけ、これを考慮に入れる必要があり、一度入力したデータの種類を制限し、正当ではない、単にそれに入りません。

QLineEditクラスについて

:にQLineEditは、単一行のテキスト入力ボックスでやり直し、元に戻すサポートし、コピー、ペースト、ドラッグ&ドロップ操作、echomodeモードのサポート、それは書き込み専用モードでは、パスワードや他の見えないテキスト、公式の説明入力することができますにQLineEditクラス

データ型は、限られたsetValidator機能することができ、

SetValidator関数のパラメータはQValidatorあり、3つの種類があります。

  • QIntValidator //制限は整数のみを入力することができ、制限
  • QDoubleValidator //制限はのみの範囲と規模を含めフロートを入力することができます
  • QRegExpValidator //制限ルール指定された正規表現

素晴らしいです!私がやりたいことをQDoubleValidatorありませんか?しかし、実際のテストでは、1 QDoubleValidatorは、小数点以下の桁と浮動小数点データ入力の数を制限することができますが、ないことが判明した後、入力範囲を限定しない、あるsetRange、setBottom、セットトップこれらの機能や設定は、それはバグQtのされ、発効していないました?私のQtのバージョンは5.8.0で、Qtの創造主のバージョンは4.2.1で、QRegExpValidatorの使用に非常に強い、正規表現の知識を理解する必要があります。ここでは詳細に使用の3種類を説明します。

QIntValidatorクラス

  • 機能

    QLineEdit限界は、正または負の整数であり、0を含む、データint型、すなわち、整数データを入力することができ

  • 相関関数

    //限制数据范围
    QIntValidator(int minimum, int maximum, QObject *parent = Q_NULLPTR)
    //获取最小值
    int bottom() 
    //设置最小值
    void setBottom(int)
    //设置数据范围
    void setRange(int bottom, int top)
    //设置最大值
    void setTop(int)
    //获取最大值
    int top() const
  • //整型限制范围100-999
    lineEdit->setValidator(new QIntValidator(100, 999, this));       
    
    //或者
    QIntValidator* aIntValidator = new QIntValidator;
    aIntValidator->setRange(100, 999);
    ui->le_L1->setValidator(aIntValidator);

QDoubleValidatorクラス

  • 機能

    QLineEdit制限が唯一の浮動小数点データを入力することができ、あなたは、小数点以下の入力範囲と番号を指定することができます

  • 相関関数

    //限制数据范围
    QDoubleValidator(double bottom, double top, int decimals, QObject *parent = Q_NULLPTR)
    //设置小数点位数
    void setDecimals(int)
    //获取设置的小数点位数
    int decimals() 
    //设置数字表示方式,标准计数法还是科学计数法
    void setNotation(Notation)
    //获取设置的计数方式
    Notation notation() 
    //设置最小值
    void setBottom(double)
    //获取设置的最小值
    double bottom() 
    //设置最大值
    void setTop(double)
    //获取设置的最大值
    double top() 
    //设置数据范围,默认无小数位
    void setRange(double minimum, double maximum, int decimals = 0)
    
//限制范围0-680,小数点2位
lineEdit->setValidator(**new** QDoubleValidator(0,680,2,**this**));

効果のない制限は、これはバグQtの可能性があります。

QRegExpValidatorクラス

  • 機能

    カスタム正規表現ルールによると、スコープの入力を制限します。

  • 相関関数

//设置按正则表达式限制
QRegExpValidator(const QRegExp &rx, QObject *parent = Q_NULLPTR)
//获取设置的正则表达式
QRegExp &regExp() 
//设置正则表达式
void setRegExp(const QRegExp &rx)
//限制-180,180,并限定小数点后4位
QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d{1,4})?)$");  
QRegExpValidator *pReg = new QRegExpValidator(rx, this);  
lineEdit->setValidator(pReg);  

正規表現について

正規表現は、また、正規表現として知られています(英語:正規表現、コードは多くの場合、正規表現、正規表現またはREと略す)、コンピュータサイエンスの概念。正規表現は、一般的に、取得モデル(ルール)のものと行のテキストを置き換えるために使用されています。多くのプログラミング言語は、文字列操作のための正規表現をサポートしています。例えば、中にはPerlそれは強力な正規表現エンジンの上に構築されています。正規表現の概念は、もともとによって開発されたのUnix(SEDとのようなソフトウェアでのツールのgrep人気を)。正規表現は、通常の「正規表現」と略記され、単数形は、正規表現、正規表現を持っている、複合体は、正規表現、正規表現、regexenを持っています。

:正規表現の詳細については、正規表現30分スタートチュートリアル

//正则表达式说明:
/*

^(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[1-9]$)|^0$
^-?(180|1?[0-7]?\d(\.\d+)?)$
^-?(180|1?[0-7]?\d(\.\d{1,4})?)$
^-?(90|[1-8]?\d(\.\d{1,4})?)$

 式子中开头的^和结尾的$限定字符串的开始和结尾;
 "-?" 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
 管道符“|”表示平行分组,比如后三个,表示180或其它形式;
 [1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
 "\d"是一个转义字符,表示匹配一位数字;
 “\.” 表示匹配小数点;
 "\d+",这里面的+表示其前面的\d重复一次或多次;
 "\d{1,4}",里面的{1,4}表示重复1到4次;

*/

QDoubleValidatorについてバグを解決

オンライン検索は再び、実際にQtのバグで、次のように達成するために、ユーザーのMyDoubleValidatorクラスで、書き換える必要があります。

  • クラス定義MyDoubleValidator
class MyDoubleValidator : public QDoubleValidator
{
    Q_OBJECT
public:
    MyDoubleValidator(QObject *parent);
    ~MyDoubleValidator();
    virtual QValidator::State validate(QString &input, int &pos) const;
};
  • 達成するための機能
#include "MyDoubleValidator.h"

MyDoubleValidator::MyDoubleValidator(QObject *parent)
    : QDoubleValidator(parent)
{
}

MyDoubleValidator::~MyDoubleValidator()
{
}

QValidator:: State MyDoubleValidator::validate(QString & input, int & pos) const
{
    if (input.isEmpty())
    {
        return QValidator::Intermediate;
    }
    bool OK = false;
    double val = input.toDouble(&OK);

    if (!OK)
    {
        return QValidator::Invalid;
    }
    
    int dotPos = input.indexOf(".");
    if (dotPos > 0)
    {
        if (input.right(input.length() - dotPos - 1).length() > decimals())
        {
            return QValidator::Invalid;
        }
    }
    if(val<bottom()|| val>top())
        return QValidator::Invalid;
    return QValidator::Acceptable;
}
  • 実用化
{
    MyDoubleValidator * dv = new  MyDoubleValidator(0);
    dv->setNotation(QDoubleValidator::StandardNotation);
    dv->setRange(2.0, 3.0, 2);
    ui.lineEdit->setValidator(dv); 
}

実装定義関数以来

小数点以下の桁数が指定されていない最初に、私はデータの型がsetValidator機能を制限することによって達成することができる知らなかった、私はデータ型がフロート検出入力データであるか否かを直接QStringのを実現し、1の戻り値は、その型フロート示しデータ、それ以外の場合はありません。

  • 達成するための機能
int Dialog::FloatCheck(QString float_str)
{
    QByteArray ba = float_str.toLatin1();//QString 转换为 char*
    const char *str = ba.data();

    int dotNum = 0;
    int dotIdx = 0;
    int Idx = 0;
    while(*str)
    {
        Idx++;
        if(*str == '.')
        {
            dotIdx = Idx;   //dot
            dotNum++;       //dot个数统计
            if(dotNum > 1)  //小数点个数超过1
                return 0;
            else if((dotNum == 0 && dotIdx) || (dotNum == 1 && dotIdx == 1))    //无小数点
            {
                return 1;
            }
        }
        if(*str != '.')
        {
            if(*str < '0' || *str > '9')
                return 0;
        }
        str++;
    }
    return 1;
}
  • テストと認定
/*

输入:
    char *str1 = "1.2345";
    char *str2 = "a.2345";
    char *str3 = "0.2345";
    char *str4 = "1a2345";
    char *str5 = "a2345";
    char *str6 = "1.2.2345";
    char *str7 = "3.234.";
    char *str8 = "3.234.a";

输出:

str1 : 1.2345 - 1
str2 : a.2345 - 0
str3 : 0.2345 - 1
str4 : 1a2345 - 0
str5 : a2345 - 0
str6 : 1.2.2345 - 0
str7 : 3.234. - 0
str8 : 3.234.a - 0

*/

歴史特集


私に注意を歓迎個人のブログwww.wangchaochao.top

私の電話番号に関する公開懸念のマイクロチャンネルスキャンコードまたは

おすすめ

転載: www.cnblogs.com/whik/p/11078650.html