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 condition_variable条件变量的用法说明

    C++11 condition_variable条件变量的用法说明

    这篇文章主要介绍了C++11 condition_variable条件变量的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++面试八股文之static_cast你了解吗

    C++面试八股文之static_cast你了解吗

    C++11引入四种新的类型转换,分别是static_cast、dynamic_cast、const_cast、和reinterpret_cast,下面就来和大家讲讲static_cast中面试常考的知识点吧
    2023-06-06
  • C++实践数组作数据成员的参考

    C++实践数组作数据成员的参考

    今天小编就为大家分享一篇关于C++实践数组作数据成员的参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言 指针与二维数组详解

    C语言 指针与二维数组详解

    本文主要介绍C语言 指针与二维数组,这里整理了详细的资料及示例代码,有需要的小伙伴可以参考下
    2016-08-08
  • C++ 正则表达式的应用详解

    C++ 正则表达式的应用详解

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等
    2021-11-11
  • C++移动语义介绍与使用讲解

    C++移动语义介绍与使用讲解

    首先,移动语义和完美转发这两个概念是在C++的模板编程的基础上,新增的特性,主要是配合模板来使用。本篇会从C++的值类型,到移动拷贝与移动赋值来理解移动语义与完美转发
    2022-09-09
  • 一文带你了解Qt中槽的使用

    一文带你了解Qt中槽的使用

    这篇文章主要为大家详细介绍了Qt中槽的使用教程,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • 12个关于C语言的有趣问答

    12个关于C语言的有趣问答

    这篇文章主要介绍了12个关于C语言的有趣问答,有助于读者加深对C语言程序设计的理解,需要的朋友可以参考下
    2014-07-07
  • 一个win32窗口创建示例

    一个win32窗口创建示例

    这篇文章主要介绍了一个win32窗口创建示例,需要的朋友可以参考下
    2014-04-04
  • C语言编程gcc如何生成静态库.a和动态库.so示例详解

    C语言编程gcc如何生成静态库.a和动态库.so示例详解

    本文主要叙述了gcc如何生成静态库(.a)和动态库(.so),帮助我们更好的进行嵌入式编程。因为有些时候,涉及安全,所以可能会提供静态库或动态库供我们使用
    2021-10-10

最新评论