Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围

 更新时间:2024年05月15日 09:03:24   作者:眸中yue  
在日常开发过程中QLineEdit作为输入框,有时要限制输入的内容,这篇文章主要给大家介绍了关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

简介

总结项目中遇到的一些问题,重写QLineEdit 实现这一功能。

1. 想在QSpinBox中设置一个输入前的提示框,但是其没有setPlaceHolderText方法,用setToolTip设置悬浮提示框只能放在控件上才能显示。

2. 用QLineEdit可以用setPlaceHolderText来设置输入前的提示框,又没有可以设置大小范围的方法。于是想到可以利用正则表达式来实现。

一、运行效果

如果是使用QDoubleSpinBox只能有的效果图:

只有鼠标移动到控件位置才行,不是想要的效果。

二、提出问题

  • QLineEdit可以输入任意字符,包括数字和文字,所以要实现只输入某一范围的数值,一开始想到用Qt内置的QDoubleValidator来实现输入0.0-100.0的浮点型数值,不知道是不是Qt的Bug,这个设置实现不了输入的限制。
    //设置输入范围,实现输入框只能输入0.0-100.0且小数点后两位
    QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2);
    m_myLineEdit->setValidator(validator);

效果图可知输入100之后再输入也是可以的,可自行尝试。

    QIntValidator *validator = new QIntValidator(0, 100);
    m_myLineEdit->setValidator(validator);

QIntValidator设置成0-100,在输入小于100的数值后,再输入还是可以输入。

解决方法

  • 既然输入的值可以显示超出设置的范围,想到可以重写一个QLineEdit,设置一个最大最小值,然后每次输入判断输入的值是否在这个范围内,不在则清空输入框。

MyLineEdit.h

#include <QWidget>
#include <QLineEdit>

class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MyLineEdit(QWidget *parent = nullptr);
public:
    //设置最大最小输入范围
    void setMaxValue(double max);
    void setMinValue(double min);
signals:

public slots:
    //当输入的值不在范围内,光标离开编辑框时清空
    void slotClearEdit(QString text);
private:
    double m_max;
    double m_min;
};

MyLineEdit.cpp

#include "MyLineEdit.h"

MyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent)
{
    connect(this, SIGNAL(textChanged(QString)), this, SLOT(slotClearEdit(QString)));
}

void MyLineEdit::setMaxValue(double max)
{
    m_max = max;
}

void MyLineEdit::setMinValue(double min)
{
    m_min = min;
}

void MyLineEdit::slotClearEdit(QString text)
{
    if(text.toDouble() < m_min || text.toDouble() > m_max)
    {
        this->clear();
    }
}

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "MyLineEdit.h"
#include <QGridLayout>
#include <QDoubleSpinBox>
#include <QIntValidator>
#include <QDoubleValidator>
#include <QRegExpValidator>

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWindow),
    m_myLineEdit(nullptr),
    m_lab(nullptr)
{
    ui->setupUi(this);
    initUI();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initUI()
{
    QGridLayout* layout = new QGridLayout(this);
    m_myLineEdit = new MyLineEdit();
    m_lab = new QLabel("输入:");
    layout->addWidget(m_lab, 0, 0);
    layout->setColumnStretch(0,1);
    layout->addWidget(m_myLineEdit, 0, 1);
    layout->setColumnStretch(1,4);

    //设置lineedit的提示
    m_myLineEdit->setPlaceholderText("请输入0.0-100.0的数");
    //设置最大最小值
    m_myLineEdit->setMaxValue(100.0);
    m_myLineEdit->setMinValue(0.0);
    //设置输入范围
    QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2);
    m_myLineEdit->setValidator(validator);
}

这样就可以通过设置一个最大最小值范围,超过范围清空输入框的方式实现想要的效果。

  • 还有一种方法是通过写一个正则表达式来限制输入的值的范围,正则表达式的使用可以参考站内文章。
   //设置lineedit的提示
   m_myLineEdit->setPlaceholderText("请输入0-100的数");
   //设置最大最小值
   //m_myLineEdit->setMaxValue(100);
   //m_myLineEdit->setMinValue(0);
   //设置输入范围
   QRegExpValidator *validator = new QRegExpValidator(QRegExp("\\d{2}|100"), this);
   m_myLineEdit->setValidator(validator);

一个完整的正则表达式是可以实现想要的效果的。

结束语

到此这篇关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的文章就介绍到这了,更多相关Qt QLineEdit输入正则限制输入范围内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于c++11与c风格路径拼接的速度对比

    关于c++11与c风格路径拼接的速度对比

    这篇文章主要介绍了关于c++11与c风格路径拼接的速度对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言使用strcmp()函数比较两个字符串的实现

    C语言使用strcmp()函数比较两个字符串的实现

    这篇文章主要介绍了C语言使用strcmp()函数比较两个字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Matlab利用遗传算法GA求解非连续函数问题详解

    Matlab利用遗传算法GA求解非连续函数问题详解

    遗传算法起源于对生物系统所进行的计算机模拟研究。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。本文将利用其求解非连续函数问题,需要的可以参考一下
    2022-09-09
  • C语言中单目操作符++、–的实例讲解

    C语言中单目操作符++、–的实例讲解

    C语言的操作符共分为算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下表引用、函数调用和结构成员这10大类,这篇文章主要给大家介绍了关于C语言中单目操作符++、–的相关资料,需要的朋友可以参考下
    2021-12-12
  • C++ 电话号码的字母组合功能实现

    C++ 电话号码的字母组合功能实现

    这篇文章主要介绍了C++ 电话号码的字母组合,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 在Qt中使用QtWebApp搭建HTTP服务器的详细步骤

    在Qt中使用QtWebApp搭建HTTP服务器的详细步骤

    QtWebApp是一个开源项目,它基于著名的Qt Framework开发,提供了一种在C++环境中构建HTTP服务器的解决方案,这篇文章主要给大家介绍了关于在Qt中使用QtWebApp搭建HTTP服务器的详细步骤,需要的朋友可以参考下
    2024-07-07
  • C++特性:迭代器

    C++特性:迭代器

    这篇文章主要介绍了C++特性:迭代器,本文主要通过介绍迭代器,迭代器和指针的区别,容器迭代器的使用等方面,需要的朋友可以参考下
    2021-06-06
  • C语言有符号和无符号在内存中的存储方式区别小结

    C语言有符号和无符号在内存中的存储方式区别小结

    有符号和无符号类型在内存中的二进制存储内容完全相同,区别仅在于编译器对二进制位的解释规则​,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-12-12
  • c++如何控制输出浮点数小数点后若干位

    c++如何控制输出浮点数小数点后若干位

    这篇文章主要介绍了c++如何控制输出浮点数小数点后若干位问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • C++修炼之拷贝构造函数

    C++修炼之拷贝构造函数

    这篇文章主要内容是6个默认成员函数之一的拷贝构造函数的认识与学习,让同学们充分理解浅拷贝与深拷贝,感兴趣的小伙伴可以参考阅读
    2023-04-04

最新评论