Qt之QLineEdit(屬性設置 輸入格式限定 信號 輸入自動補全)

QLineEdit小部件是一個單行文本編輯器,常常作爲輸入控件使用,接收用戶的數據。本篇博客將從以下幾個方面來對QLineEdit進行介紹:

[1]常用屬性設置

[2]指定輸入格式

[3]信號事件

[4]輸入自動補全

其中,重點是QLineEdit的指定格式輸入。比如可以限定用戶只能輸入數字、限制用戶只能輸入字母、限制用戶只能輸入IP地址、限制用戶只能輸入MAC地址等等。

至於QLineEdit QSS樣式設置,後面單獨開出一篇博客來講。

常用屬性設置

注:以下屬性可以在代碼中進行設置,也可以在ui設計器中進行設置。

輸入掩碼設置:

void setInputMask(const QString &inputMask)

通過設置輸入板掩碼,可以限定用戶的輸入內容,指定某個格式輸入。

 

文本相關:

//得到QLineEdit的文本內容(和QLabel類似)
QString text() const

//得到被選擇的文本
QString selectedText() const

//設置QLineEdit的文本
void setText(const QString &)

設置輸入提示

void setPlaceholderText(const QString &)

最大長度設置:

void setMaxLength(int)

回顯模式:

void setEchoMode(QLineEdit::EchoMode)

可選參數:

QLineEdit::Normal:

顯示輸入的字符(默認模式)

QLineEdit::NoEcho:

關閉回顯,不顯示任何內容(常用在輸入密碼時對密碼長度進行保護)

QLineEdit::Password:

顯示與平臺相關的密碼掩碼字符,而不是實際輸入的字符(如顯示點)。

QLineEdit::PasswordEchoOnEdit

在輸入時顯示當前輸入的字符,現在的很多密碼輸入框也是這種機制

設置只讀

void setReadOnly(bool)

設置清除按鈕

void setClearButtonEnabled(bool enable)

打開此屬性後,編輯框最後面將會有一個"叉號",可以一鍵清除所有內容。

由於代碼簡單,現象明確,並且可以直接在ui設計器中設置,這裏就不專門演示了。

 

指定輸入格式

InputMask進行輸入格式限定

Qt可以通過設置InputMask進行輸入格式限定。

下表列出inputMask具體定義:

A ASCII字母字符。A - Z、a - z,不可省略
a ASCII字母字符。A - Z、a - z,可省略
N ASCII字母數字字符。A - Z 、 a - z  、0 - 9 ,不可省略
n ASCII字母數字字符。A - Z 、 a - z  、0 - 9 ,可省略
X 任何字符,不可省略
x 任何字符,可省略
9 0 - 9數字,不可省略
0 0 - 9數字,可省略
D 1 - 9數字,不可省略
d 1 - 9數字,可省略
# ASCII數字或正負號,可省略
H 16進製表示所用字符,A - F、a - f、0 - 9,不可省略
h 16進製表示所用字符,A - F、a - f、0 - 9,可省略
B 2進製表示所用字符,0 -1,不可省略
b 2進製表示所用字符,0 -1,可省略
> 其後輸入的所有小寫字母均自動轉換爲大寫
< 其後輸入的所有大寫字母均自動轉換爲小寫
關閉大小寫轉換
\ 如果輸入框中出現了表中規定的特殊字符,可以加上此符號轉義

示例:

1.    000.000.000.000;_

限定輸入格式爲IP地址,省略字符部分用  _  填充(;_可選)

2.    HH:HH:HH:HH:HH:HH;_

限定輸入格式爲MAC地址的形式

代碼:

ui->ipEdit->setInputMask("000.000.000.000;_");
ui->macEdit->setInputMask("HH:HH:HH:HH:HH:HH;_");

通過設置inputMask只能限制用戶的輸入,要想真正的檢驗數據是否正確,需要用到QValidator或將inputMask與QValidator結合起來使用。

QValidator進行輸入格式限定以及檢查輸入結果是否正確

QDoubleValidator、QIntValidator、QRegExpValidator、QRegularExpressionValidator繼承自QValidator,QDoubleValidator限定輸入爲double類型的數字、QIntValidator限定輸入爲整數、QRegExpValidator和QRegularExpressionValidator以正則表達式的形式限定輸入格式。

限定輸入爲整型數據,且範圍爲1-100:

QIntValidator *intVal = new QIntValidator();
intVal->setRange(1, 100);
ui->intEdit->setValidator(intVal);

驗證是否正確(如點下確定按鈕時用以下代碼進行驗證)

QString intEditText = ui->intEdit->text();
int pos = 0;
if(ui->intEdit->validator()->validate(intEditText,pos) == QValidator::Acceptable)
{
    qDebug() << "輸入正確";
}
else 
{
    qDebug() << "輸入錯誤";
}

限定輸入爲浮點數,範圍從-5到1000,小數點後3位,不用科學計數法

QDoubleValidator *doubleVal = new QDoubleValidator();
doubleVal->setRange(-5, 1000,3);
//不用科學計數法
doubleVal->setNotation(QDoubleValidator::StandardNotation);
ui->doubleEdit->setValidator(doubleVal);

其驗證是否正確的方法同上

用正則表達式限定輸入,以IP地址爲例

//驗證ip地址
QRegExp exp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator *ipVal = new QRegExpValidator(exp);
ui->ip1Edit->setValidator(ipVal);

其驗證是否正確的方法同上

QLineEdit信號事件

光標移動時發出的信號:

void cursorPositionChanged(int oldPos, int newPos)

當按下Return或Enter鍵或行編輯失去焦點時,發出的信號:

void editingFinished()

注意,如果設置了validator()或inputMask(),並且按下enter/return鍵,只有當輸入遵循inputMask()並且validator()返回QValidator:: accepator時,纔會發出editingFinished()信號。


當輸入不被接受時所發出的信號:

void inputRejected()

致使輸入不被接受的條件:

長度超過設定的最大長度

輸入不符合setMask的設定或validator的設定

當按下當按下Return或Enter鍵時發出的信號:

void returnPressed()

當按下Return或Enter鍵時,將發出此信號。注意,如果在行編輯中設置了validator()或inputMask(),那麼只有當輸入遵循inputMask()並且validator()返回QValidator:: accepator時,纔會發出returnPressed()信號。


當選擇發生改變時發出的信號:

void selectionChanged()

當文本改變時發出的信號:
 

void textChanged(const QString &text)

編輯文本時發出的信號:

void textEdited(const QString &text)

無論何時,只要編輯文本就會發出此信號。

輸入自動補全

QLineEdit的輸入自動補全用到了setCompleter

在這裏以一個自動補全1-10英文數字的QLineEdit爲例:

QStringList listNumber;
listNumber << "one" << "two" << "three" << "four" << "five" << "six" << "seven" << "eight" << "nine" << "ten";
QCompleter *completer = new QCompleter(listNumber);
//忽略大小寫
completer->setCaseSensitivity(Qt::CaseInsensitive);
ui->numberEdit->setCompleter(completer);

通過編寫以上代碼,當用戶在輸入時,會根據用戶的輸入自動匹配listNumber裏的內容。

也可以實現動態添加補全內容(如按下搜索按鈕,自動將當前輸入放入補全列表中)

修改上一段代碼爲:

listNumber << "one" << "two" << "three" << "four" << "five" << "six" << "seven" << "eight" << "nine" << "ten";
listModel = new QStringListModel(listNumber,this);
completer = new QCompleter(listModel);
//忽略大小寫
completer->setCaseSensitivity(Qt::CaseInsensitive);
ui->numberEdit->setCompleter(completer);

在搜索按鈕對應的槽函數中添加如下代碼:

if(!listNumber.contains(ui->numberEdit->text()))
{
    qDebug() << "append";
    listNumber.append(ui->numberEdit->text());
    listModel->setStringList(listNumber);
}

如上就實現了動態添加補全內容,這兩段代碼與上面的區別是一個使用QStringList對QCompleter進行的初始化,一個是用QStringListModel*進行的初始化。之所以改爲用QStringListModel進行初始化,是因爲QCompleter並沒有提供改變補全列表的接口,只能在初始化時一次性指定。

其構造函數原型如下:

QCompleter(QAbstractItemModel *model, QObject *parent = nullptr);

QCompleter(const QStringList& completions, QObject *parent = nullptr);

可以看到當兩者的區別,一個是傳地址,一個是傳引用。如果想動態改變補全列表的內容,只能用傳地址的方式進行初始化。而QStringListModel正是繼承QAbstractItemModel 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章