QIntValidator和QLineEdit一起用很蛋疼?

横云断岭
博客专家认证
2010-11-22 01:41:56
想用来限制QLineEdit只能输入某一范围的整数。比如(100,200)
但是杯具的是QIntValidator只限制比200大的数不可以输入,比100小的数却可以输入。
而且当QLineEdit失去焦点,或者回车时输入的数不会自动改正,也不会有提醒信息。

蛋疼的是QLineEdit的两个signal:
void editingFinished ()
void returnPressed ()
都是在QIntValidator的state是QValidator::Acceptable,即输入的数是(100,200)之间时才发出。

请问怎样实现当输入比100小的数时,失去焦点时可以自动修正,或者弹个提示框?

validator.h

#ifndef VALIDATOR_H
#define VALIDATOR_H

#include <QWidget>
#include <QtGui>
#include <QIntValidator>
#include <QDoubleValidator>

class Validator : public QWidget
{
Q_OBJECT
private:
int m_int;
double m_double;
QLineEdit *intEdit;
QLineEdit *doubleEdit;
QIntValidator *intVal;
QDoubleValidator *douVal;
public:
explicit Validator(QWidget *parent = 0);

signals:

public slots:
void nodify();

};

#endif // VALIDATOR_H



validator.cpp

#include "validator.h"

#include <QHBoxLayout>

Validator::Validator(QWidget *parent) :
QWidget(parent)
{
intVal = new QIntValidator(100, 200, this);

intEdit = new QLineEdit(this);
doubleEdit = new QLineEdit;

douVal = new QDoubleValidator;

intEdit->setValidator(intVal);


QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(intEdit);
layout->addWidget(doubleEdit);
this->setLayout(layout);

//无效
connect(intEdit, SIGNAL(editingFinished()), this, SLOT(nodify()));
connect(intEdit, SIGNAL(returnPressed()), this, SLOT(nodify()));

}

void Validator::nodify()
{
int n = (intEdit->text()).toInt();
if(n < 100 )
n = 100;

intEdit->setText(QString("%1").arg(n));
}


...全文
2613 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbzhang800 2010-11-22
  • 打赏
  • 举报
回复 1
答案很简单,你可以先自己尝试解决。中午有时间的话我会整理一下这个问题的两个答案
横云断岭 2010-11-22
  • 打赏
  • 举报
回复
额,原来要QLineEdit会调用fixup
fixup() is provided for validators that can repair some user errors. The default implementation does nothing. QLineEdit, for example, will call fixup() if the user presses Enter (or Return) and the content is not currently valid. This allows the fixup() function the opportunity of performing some magic to make an Invalid string Acceptable.

自己写了个,勉强可以了。。

class MyValidator : public QIntValidator
{
Q_OBJECT
public:
explicit MyValidator(QObject * parent = 0):QIntValidator(parent)
{
}
MyValidator(int bottom, int top, QObject * parent):QIntValidator(bottom, top, parent)
{
}
virtual void setRange(int bottom, int top)
{
QIntValidator::setRange(bottom, top);
}
~MyValidator()
{
}
virtual State validate(QString &s, int &n) const
{
return QIntValidator::validate(s, n);
}
virtual void fixup(QString &s) const
{
s = QString("%1").arg(bottom());
}
};

dbzhang800 2010-11-22
  • 打赏
  • 举报
回复
http://hi.baidu.com/cyclone/blog/item/663709236315e95e925807d1.html

16,223

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧