在做界面編程的時候,對文本框的處理往往是個很頭疼的事情,一是焦點進入文本框時,從人性化考慮,應選擇文本框中文本,方便輸入;二是,限制文本框的輸入,只允許輸入有效的文本,如果不這樣做的話,那么就需要在程序中濾去非法輸入。在這里介紹一種解決上述兩個問題的方法:
- #ifndef _EDIT_H
- #define _EDIT_H
- #include <qlineedit.h>
- class CEdit : public QLineEdit {
- Q_OBJECT
- public:
- CEdit(QWidget *parent);
- ~CEdit();
- enum tagValidatorType {
- vtFloat,
- vtInt,
- vtNoValidator,
- };
- void updateValidator(int type);
- protected:
- void mousePressEvent(QMouseEvent *event);
- void focusInEvent(QFocusEvent *event);
- private:
- int validatorType;
- bool bInit;
- };
- #endif
CEdit派生自QLineEdit,重載focusInEvent,在這里實現選擇文本框中的文本,解決上面的第一個問題;updateValidator方法實現限制文本框的輸入,通過該函數,解決上面的第二個問題。下面我們來看實現:
- #include "baseedit.h"
- #include <QRegExpValidator>
- CEdit::CEdit(QWidget *parent) : QLineEdit(parent)
- {
- setAlignment(Qt::AlignCenter);
- validatorType = vtNoValidator;
- bInit = false;
- }
- CEdit::~CEdit()
- {
- }
- void CEdit::updateValidator(int type)
- {
- if (type != validatorType)
- {
- validatorType = type;
- switch(type)
- {
- case vtFloat:
- {
- QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- setValidator(pReg);
- }
- break;
- case vtInt:
- {
- QRegExp rx("^([1-9][0-9]{0,3}|[1-5][0-9]{0,4}|[1-6][0-4][0-9]{0,3}|[1-6][0-5][0-4][0-9]{0,2}|[1-6][0-5][0-5][0-2][0-9]{0,1}|[1-6][0-5][0-5][0-3][0-5])$|(^\\t?$)");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- setValidator(pReg);
- }
- break;
- }
- }
- }
- void CEdit::mousePressEvent(QMouseEvent *event)
- {
- if (bInit)
- bInit = false;
- else
- QLineEdit::mousePressEvent(event);
- }
- void CEdit::focusInEvent(QFocusEvent *event)
- {
- QLineEdit::focusInEvent(event);
- QString str = text();
- setSelection(0, str.length());
- bInit = true;
- }
首先來看updateValidator,當type=vtFloat時,浮點數的限制范圍為[-999999.9999,999999.9999];當type=vtInt時,整數的輸入范圍為[1,65535]。大家也可以根據自己的要求,通過設置對應的正則表達式來設置自己的限制條件,如果你不懂正則表達式的話,可以baidu下,很簡單的。好了我們再來看看focusInEvent,這個重載QLineEdit編輯框的焦點進入事件,在里面選擇文本,這里的bInit變量是為了防止mousePressEvent把在focusInEvent里面選擇的文本取消,因為焦點進入事件比mousePressEvent事件響應的早。
到這里,本文開頭提的兩個問題都解決了。下面是使用CEdit了:
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- CEdit edit;
- edit.updateValidator(CEdit::vtInt);
- edit.resize(40, 120);
- edit.show();
- app.exec();
- }
http://blog.csdn.net/rabinsong/article/details/8932713
一個更具體的實例:
http://blog.csdn.net/rabinsong/article/details/8997181
