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));
}


...全文
3588 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
内容概要:本文研究了基于共识的捆绑算法(CBBA)在多智能体系统中的多任务分配问题,重点应用于远程太空船交会与维修的相对运动规划(RPO)任务。通过Matlab代码实现了CBBA算法,解决了多个航天器在复杂空间环境下协同执行交会、对接与维修任务时的任务分配挑战。研究突出该算法在分布式决策、冲突避免与资源优化方面的优势,详细探讨了任务打包、竞标机制与共识达成等核心环节,验证了其在无中央控制器条件下实现高效、鲁棒任务分配的有效性。; 适合人群:具备航天动力学、控制理论、多智能体系统及优化算法基础,从事航天器自主任务规划、分布式协同控制等相关领域的研究生、科研人员及工程师。; 使用场景及目标:① 实现多航天器在通信受限与信息不完整的远程空间环境下的自主任务分配;② 提升RPO任务中路径规划与资源调度的效率与安全性;③ 构建去中心化的多智能体协同框架,增强系统整体鲁棒性与可扩展性。; 阅读建议:建议结合提供的Matlab代码深入理解CBBA算法的实现逻辑,重点关注竞标权重设计、任务冲突消解与共识收敛过程,并可通过调整任务规模、通信拓扑与约束条件进行仿真实验,以全面掌握算法性能与适用边界。

21,496

社区成员

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

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