QT限制文本框输入的方法 以你之姓@ 2022-04-24 09:02 706阅读 0赞 # QT限制文本框输入的方法 # 界面编程的时候,对文本框的处理往往是个很头疼的事情: 一是焦点进入文本框时,从人性化考虑,应选择文本框中文本,方便输入; 二是,限制文本框的输入,只允许输入有效的文本,如果不这样做的话,那么就需要在程序中滤去非法输入。 在这里介绍一种解决上述两个问题的方法: \#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\]。大家也可以根据自己要求,通过设置对应的正则表达式来设置自己的限制条件。再来看看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(); \}
还没有评论,来说两句吧...