Qt中正則表示式的使用
阿新 • • 發佈:2019-01-24
今天的工作中,遇到一個需求,就是介面的一個對話方塊中需要填入需求的字串,因為如果填的字串是隨意的內容的話,下載到下位機上可能會使得下位機崩潰。因此我研究了一下Qt中的QLineEdit
控制元件中使用正則表示式。首先查了一些文件,並且對此進行設定,發現只要新建一個QLineEdit
後呼叫其中的QLineEdit::setValidator(const QValidator * v)
即可。其中的QValidator
派生了四個類QDoubleValidator, QIntValidator, QRegExpValidator, 和 QRegularExpressionValidator
。根據多型直接傳入其子類QRegExpValidator
QRegularExpressionValidator
即可進行正則表示式的輸入。其中QRegExpValidator
構造時傳入的QRegExp
類來進行正則表示式的構造。Qt5出來後推薦使用QRegularExpressionValidator
傳入的引數QRegularExpression
進行正則表示式的構造。
當然構造的方式我就不詳細說了,網上一搜有好多。這裡舉一個使用正則表示式限制QLineEdit
的測試例子:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
public Q_SLOTS:
void accept() override;
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QMessageBox>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->lineEdit_1->setValidator(new QRegExpValidator(QRegExp(tr("[0-9]+")),this)); //設定只能輸入數字
ui->lineEdit_2->setValidator(new QRegExpValidator(QRegExp(tr("[-]?[0-9]+,[0-9]+")),this)); //設定
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::accept()
{
if(!QRegExp(tr("[0-9]+")).exactMatch(ui->lineEdit_1->text()))
{
QMessageBox temMB(QMessageBox::Warning,
tr("警告"),
tr("第一行輸入錯誤,預設輸入是1\n請問是否設定為預設值?"),
QMessageBox::Yes | QMessageBox::No);
temMB.setButtonText(QMessageBox::Yes,tr("是"));
temMB.setButtonText(QMessageBox::No,tr("否"));
if(temMB.exec() == QMessageBox::Yes)
ui->lineEdit_1->setText(tr("1"));
return;
}
if(!QRegExp(tr("[-]?[0-9]+,[0-9]+")).exactMatch(ui->lineEdit_2->text()))
{
QMessageBox temMB(QMessageBox::Warning,
tr("警告"),
tr("第二行輸入錯誤,預設輸入是1,1\n請問是否設定為預設值?"),
QMessageBox::Yes | QMessageBox::No);
temMB.setButtonText(QMessageBox::Yes,tr("是"));
temMB.setButtonText(QMessageBox::No,tr("否"));
if(temMB.exec() == QMessageBox::Yes)
ui->lineEdit_2->setText(tr("1,1"));
return;
}
qDebug()<<ui->lineEdit_1->text()<<'\n'<<ui->lineEdit_2->text();
QDialog::accept();
}
注意,我發現雖然設定了正真表示式後,QLineEdit
只能保證輸入的時候可以按照其規則輸入,但是不能保證客戶使用的時候輸入完全,比如需要輸入座標(23,34),客戶可能沒有輸入逗號,還是可以按確定按鈕的,為了讓其完全有保證,必須在按下接受按鈕的時候再次檢驗,這是可以重寫QDialog
的accept()
函式,並在裡面再次使用正則表示式QRegExp
類的exactMatch
進行匹配來達到目的。