Qt 之 QLineEdit
簡述
QLineEdit是一個單行文字輸入框。
QLineEdit允許使用者輸入和編輯單行純文字,提供了很多有用的編輯功能,包括:撤消和重做、剪下和貼上、以及拖放(見setDragEnabled())。
通過改變輸入框的echoMode(),同時也可以設定為一個“只寫”欄位,用於輸入密碼等。
文字的長度可以被限制為maxLength(),可以使用一個validator()或inputMask()來任意限制文字。當在同一個輸入框中切換驗證器和輸入掩碼的時候,最好是清除驗證器或輸入掩碼,防止不確定的行為。
|
內容
詳細介紹
與其相關的一個類是QTextEdit - 允許多行、富文字編輯。
可以使用setText()或insert()來改變文字,通過text()來獲取文字;顯示的文字(可能不同,詳見:EchoMode)通過displayText()來獲取。文字可以使用setSelection()或selectAll()來選中,選中的文字可以被cut()、copy()和paste(),使用setAlignment()來設定文字的對齊方式。
當文字改變時,會發射textChanged()訊號。當使用setText()改變文字時,textEdited()訊號也會發射。游標位置發生變化時,會發射cursorPositionChanged()訊號,當Return或Enter鍵被按下時,發射returnPressed()訊號。
當編輯完成,或者是因為輸入框失去焦點,或Return/Enter鍵被按下時,發出的editingFinished()訊號。
注意:如果輸入框有一個驗證器,returnPressed()/editingFinished()訊號只有在驗證期返回QValidator::Acceptable的時候才會被髮射。
預設情況下,QLineEdit具有由平臺風格指南規定的邊框,可以通過setFrame(false)將其關閉。
預設鍵被繫結描述如下。輸入框還提供了一些編輯選項的上下文選單(通常通過單擊滑鼠右鍵呼叫)。
按鍵 | 動作 |
---|---|
Left Arrow | 游標左移一個字元 |
Shift+Left Arrow | 游標左移並選擇一個字元 |
Right Arrow | 游標右移一個字元 |
Shift+Right Arrow | 游標右移並選擇一個字元 |
Home | 將游標移動到行的開頭 |
End | 將游標移動到行的末尾 |
Backspace | 刪除游標左側字元 |
Ctrl+Backspace | 刪除游標左側的單詞 |
Delete | 刪除游標右側字元 |
Ctrl+Delete | 刪除游標右側的單詞 |
Ctrl+A | 全選 |
Ctrl+C | 複製選中的文字複製到剪貼簿 |
Ctrl+Insert | 複製選中的文字複製到剪貼簿 |
Ctrl+K | 刪除此處至末尾所有內容 |
Ctrl+V | 貼上剪貼簿的文字到輸入框中 |
Shift+Insert | 貼上剪貼簿的文字到輸入框中 |
Ctrl+X | 剪下選中的文字到剪貼簿 |
Shift+Delete | 剪下選中的文字到剪貼簿 |
Ctrl+Z | 撤銷上一次操作 |
Ctrl+Y | 重做上一次操作 |
共有型別
列舉:QLineEdit::ActionPosition
描述如何顯示加入到輸入框中的action部件。
常量 | 值 | 描述 |
---|---|---|
QLineEdit::LeadingPosition | 0 | 當使用佈局方向Qt::LeftToRight時,部件顯示在文字左側;使用Qt::RightToLeft時,則顯示在右側。 |
QLineEdit::TrailingPosition | 1 | 當使用佈局方向Qt::LeftToRight時,部件顯示在文字右側;使用Qt::RightToLeft時,則顯示在左側。 |
列舉:QLineEdit::EchoMode
描述輸入框如何顯示其內容。
常量 | 值 | 描述 |
---|---|---|
QLineEdit::Normal | 0 | 正常顯示輸入的字元,預設選項。 |
QLineEdit::NoEcho | 1 | 不顯示任何輸入,常用於密碼型別,其密碼長度都需要保密的時候。 |
QLineEdit::Password | 2 | 顯示平臺相關的密碼掩碼字元,而不是實際的字元輸入。 |
QLineEdit::PasswordEchoOnEdit | 3 | 在編輯的時候顯示字元,負責顯示密碼型別。 |
常用介面
這裡列舉了一些常用介面,但並非全部的,要獲得更多資訊請參考助手。
QString text() const
返回輸入框的當前文字。void addAction(QAction * action, ActionPosition position)
QAction * addAction(const QIcon & icon, ActionPosition position)
新增action至指定位置。Qt::Alignment alignment() const
void setAlignment(Qt::Alignment flag)
alignment : Qt::Alignment
屬性儲存了輸入框的對齊方式(水平和垂直方向)。Qt::AlignJustify對映到Qt::AlignLeft。
預設情況下,該屬性包含Qt::AlignLeft和Qt::AlignVCenter。QCompleter* completer() const
void setCompleter(QCompleter * c)
QCompleter後面詳細講解。void deselect()
取消選中任何已選中的文字。QString displayText() const
返回顯示的文字。預設值為一個空字串。
如果echoMode是Normal,和text()返回的一樣;如果EchoMode是Password或PasswordEchoOnEdit,會返回平臺相關的密碼掩碼字元,長度為text().length(),例如:"******"
;如果EchoMode是NoEcho,返回一個空字串""
。QString selectedText() const
返回選中的的文字。如果沒有選中,返回一個空字串。預設為一個空字串。int cursorPosition() const
void setCursorPosition(int)
cursorPosition : int
屬性包含輸入框當前游標的位置。設定游標位置時,會導致應有的重繪。預設情況下,屬性值為0。EchoMode echoMode() const
void setEchoMode(EchoMode)
echoMode : EchoMode
屬性儲存了輸入框的顯示模式。顯示模式決定了輸入框對使用者的文字顯示。預設值為Normal
最常用的設定是Normal,使用者輸入文字被逐字顯示;還包含其它模糊輸入,例如:NoEcho、Password和PasswordEchoOnEdit。
部件的顯示、複製或拖動文字的行為受此設定的影響。int maxLength() const
void setMaxLength(int)
maxLength : int
此屬性包含文字的最大允許長度。如果文字太長,將從限制的位置截斷。預設值為32767。
如果發生截斷任何選中的文字將取消選中,游標位置設定為0,並且顯示字串的第一部分。
如果輸入框有一個輸入掩碼,那麼,掩碼定義字串的最大長度。QString placeholderText() const
void setPlaceholderText(const QString &)
placeholderText : QString
當輸入框為空時,輸入框顯示一個灰色的佔位符文字。預設值為一個空字串。
通常,一個空的輸入框顯示佔位符文字,即使它有焦點。然而,如果內容水平居中,當輸入框有焦點時,佔位符文字不顯示在游標下。bool isReadOnly() const
void setReadOnly(bool)
readOnly : bool
此屬性儲存輸入框是否為只讀。
在只讀模式下,使用者仍然可以將文字複製到剪貼簿,或拖放文字(如果echoMode()是Normal),但不能編輯它。
只讀模式下,QLineEdit也不顯示游標。void setSelection(int start, int length)
從位置start選擇文字為length個字元,允許負長度。void setValidator(const QValidator * v)
設定輸入框的驗證器,將限制任意可能輸入的文字。如果v == 0,將會清除當前的輸入驗證器
如果v = = 0,setValidator()刪除當前的輸入驗證器。初始設定是沒有輸入驗證器(即:接受任何輸入到maxLength())。const QValidator * validator() const
返回一個當前輸入的驗證器指標,如果沒有設定驗證器,返回0。QString inputMask() const
void setInputMask(const QString & inputMask)
inputMask : QString
此屬性儲存驗證器的輸入掩碼。如果沒設定研發,inputMask() 或返回一個空字串。傳遞一個空字串可以取消驗碼並返回一個正常QLineEdit。
下表列出了可在一個輸入掩碼中使用的字元。空格字元,是一個空白的預設字元,當一個字元是允許的,但不是必須的請胯下。
字元 | 含義 |
---|---|
A | ASCII字母字元是必須的,A-Z、a-z。 |
a | ASCII字母字元是允許的,但不是必須的。 |
N | ASCII字母字元是必須的,A-Z、a-z、0-9。 |
n | ASCII字母字元是允許的,但不是必須的。 |
X | 任何字元都是必須要的。 |
x | 任何字元都是允許的,但不是必須要的。 |
9 | ASCII數字是必須要的,0-9。 |
0 | ASCII數字是允許的,但不是必須要的。 |
D | ASCII數字是必須要的,1-9。 |
d | ASCII數字是允許的,但不是必須要的 (1-9)。 |
# | ASCII數字或加/減符號是允許的,但不是必須要的。 |
H | 十六進位制資料字元是必須要的,A-F、a-f、0-9。 |
h | 十六進位制資料字元是允許的,但不是必須要的。 |
B | 二進位制資料字元是必須要的,0-1。 |
b | 二進位制資料字元是允許的,但不是必須要的。 |
> | 所有的字元字母都大寫 |
< | 所有的字元字母都小寫 |
! | 關閉大小寫轉換 |
\ | 使用 \ 去轉義上述列出的字元。 |
掩碼由掩碼字元和分隔符字串組成,後面可以跟一個分號和用於空白的字元,空白字元在編輯後總是從文字中刪除。
示例:
掩碼 | 注意事項 |
---|---|
000.000.000.000;_ | IP地址,空白是_。 |
HH:HH:HH:HH:HH:HH;_ | MAC地址。 |
0000-00-00 | ISO日期,空白是空格。 |
>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;# |
License號,空白是-和所有(字母)字元轉換為大寫。 |
訊號
void selectionChanged()
只要選擇改變這個訊號就會被髮射。void cursorPositionChanged(int old, int new)
只要游標移動,這個訊號就會發射。前面的位置old,新的位置是new。void editingFinished()
- void returnPressed()
- void textChanged(const QString & text)
- void textEdited(const QString & text)
參考:“詳細描述”
共有槽
void clear()
清除輸入框內容void copy() const
如果echoMode()是Normal,將選中的文字複製到剪貼簿。void cut()
如果echoMode()是Normal,將所選文字複製到剪貼簿並刪除它。
如果當前的驗證不允許刪除選定的文字,cut()將複製而不刪除。void paste()
如果輸入框不是隻讀的,插入剪貼簿中的文字到游標所在位置,刪除任何選定的文字。
如果最終的結果不被當前的驗證器接受,將沒有任何反應。void redo()
重做上次操作,如果redo可用(isRedoAvailable() )。void selectAll()
選中所有文字(即:高亮),並將游標移動到末尾。當一個預設值被插入時,這非常有用,因為如果使用者在點選部件之前就輸入,選中的文字將被刪除。void setText(const QString &)
設定輸入框顯示的文字。void undo()
撤消上次操作,如果撤消可用( isUndoAvailable())。取消任何當前的選中,並更新選中到當前游標位置。
示例
QLineEdit::EchoMode效果
首先,來演示QLineEdit::EchoMode的效果。
效果
原始碼
QLineEdit *pNormalLineEdit = new QLineEdit(this);
QLineEdit *pNoEchoLineEdit = new QLineEdit(this);
QLineEdit *pPasswordLineEdit = new QLineEdit(this);
QLineEdit *pPasswordEchoOnEditLineEdit = new QLineEdit(this);
pNormalLineEdit->setPlaceholderText("Normal");
pNoEchoLineEdit->setPlaceholderText("NoEcho");
pPasswordLineEdit->setPlaceholderText("Password");
pPasswordEchoOnEditLineEdit->setPlaceholderText("PasswordEchoOnEdit");
// 設定顯示效果
pNormalLineEdit->setEchoMode(QLineEdit::Normal);
pNoEchoLineEdit->setEchoMode(QLineEdit::NoEcho);
pPasswordLineEdit->setEchoMode(QLineEdit::Password);
pPasswordEchoOnEditLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
自定義搜尋框
關於搜尋框,我們經常接觸。例如:瀏覽器搜尋、Windows資源管理器搜尋等。
效果
原始碼
通過QLineEdit的addAction()函式來加入action,這裡我們使用了過載函式。
m_pLineEdit = new QLineEdit(this);
m_pLabel = new QLabel(this);
m_pLineEdit->setPlaceholderText(QString::fromLocal8Bit("請輸入搜尋內容"));
// 新增action
QAction *pLeadingAction = new QAction(this);
pLeadingAction->setIcon(QIcon(":/Images/leading"));
m_pLineEdit->addAction(pLeadingAction, QLineEdit::LeadingPosition);
QAction *pTrailingAction = m_pLineEdit->addAction(QIcon(":/Images/trailing"), QLineEdit::TrailingPosition);
// 連線訊號和槽
connect(pTrailingAction, SIGNAL(triggered(bool)), this, SLOT(onSearch(bool)));
槽函式,用於獲取輸入框中的內容,然後處理。
void MainWindow::onSearch(bool checked)
{
QString strText = m_pLineEdit->text();
m_pLabel->setText(QString::fromLocal8Bit("輸入內容為:%1").arg(strText));
}
驗證器
通常情況下,我們會對使用者的輸入做一些限制,可以通過驗證起來設定,常見的有:整形、浮點型及其它自定義驗證器。
效果
原始碼
QLineEdit *pIntLineEdit = new QLineEdit(this);
QLineEdit *pDoubleLineEdit = new QLineEdit(this);
QLineEdit *pValidatorLineEdit = new QLineEdit(this);
pIntLineEdit->setPlaceholderText(QString::fromLocal8Bit("整形"));
pDoubleLineEdit->setPlaceholderText(QString::fromLocal8Bit("浮點型"));
pValidatorLineEdit->setPlaceholderText(QString::fromLocal8Bit("字母和數字"));
// 整形 範圍:[1, 99]
QIntValidator *pIntValidator = new QIntValidator(this);
pIntValidator->setRange(1, 99);
// 浮點型 範圍:[-360, 360] 精度:小數點後2位
QDoubleValidator *pDoubleValidator = new QDoubleValidator(this);
pDoubleValidator->setRange(-360, 360);
pDoubleValidator->setNotation(QDoubleValidator::StandardNotation);
pDoubleValidator->setDecimals(2);
// 字元和數字
QRegExp reg("[a-zA-Z0-9]+$");
QRegExpValidator *pValidator = new QRegExpValidator(this);
pValidator->setRegExp(reg);
pIntLineEdit->setValidator(pIntValidator);
pDoubleLineEdit->setValidator(pDoubleValidator);
pValidatorLineEdit->setValidator(pValidator);
輸入掩碼
要限制使用者輸入,除了驗證器,還可以使用輸入掩碼,常見的有IP、MAC地址、日期、License號等。
效果
原始碼
QLineEdit *pIPLineEdit = new QLineEdit(this);
QLineEdit *pMACLineEdit = new QLineEdit(this);
QLineEdit *pDateLineEdit = new QLineEdit(this);
QLineEdit *pLicenseLineEdit = new QLineEdit(this);
pIPLineEdit->setInputMask("000.000.000.000;_");
pMACLineEdit->setInputMask("HH:HH:HH:HH:HH:HH;_");
pDateLineEdit->setInputMask("0000-00-00");
pLicenseLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");