序文
最近、小型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 ®Exp()
//设置正则表达式
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
*/
歴史特集
- ソフトウェアの自動アップデートのQtを実装する簡単な方法
- QtのアシスタントLEDシリアル制御の小物
- 箱から出して真のRISC-V開発ボード--VEGAベガ評価開発ボード
- あなたはJLINK-OBデバッガ(回路図、PCB、住宅、ファームウェアを含む)を作成して教え
私に注意を歓迎個人のブログ:www.wangchaochao.top
私の電話番号に関する公開懸念のマイクロチャンネルスキャンコードまたは