在做界面编程的时候,对文本框的处理往往是个很头疼的事情,一是焦点进入文本框时,从人性化考虑,应选择文本框中文本,方便输入;二是,限制文本框的输入,只允许输入有效的文本,如果不这样做的话,那么就需要在程序中滤去非法输入。在这里介绍一种解决上述两个问题的方法:
#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(); }