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