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 。