C++ 如何在Qt中将输入掩码和QValidator一次设置为QLineEdit?

C++ 如何在Qt中将输入掩码和QValidator一次设置为QLineEdit?,c++,qt,qtgui,qtcore,qlineedit,C++,Qt,Qtgui,Qtcore,Qlineedit,我想要一个接受ip地址的行编辑。如果我将输入掩码设置为: ui->lineEdit->setInputMask("000.000.000.000"); 它接受大于255的值。如果我给一个验证器,那么我们必须在每三位数字后给一个点(.)。最好的处理方法是什么 它接受大于255的值 绝对正确,因为“0”表示: 正如你所见,这不是你喜欢的茶。至少有以下几种方法可以绕过它: 编写自定义验证器 使用正则表达式 将输入拆分为四个条目,并单独验证每个条目,同时在条目之间仍保留可视分隔符 re

我想要一个接受ip地址的行编辑。如果我将输入掩码设置为:

ui->lineEdit->setInputMask("000.000.000.000");
它接受大于255的值。如果我给一个验证器,那么我们必须在每三位数字后给一个点(.)。最好的处理方法是什么

它接受大于255的值

绝对正确,因为“0”表示:

正如你所见,这不是你喜欢的茶。至少有以下几种方法可以绕过它:

  • 编写自定义验证器

  • 使用正则表达式

  • 将输入拆分为四个条目,并单独验证每个条目,同时在条目之间仍保留可视分隔符

regex解决方案可能是最快但也是最丑陋的IMHO:

QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
// You may want to use QRegularExpression for new code with Qt 5 (not mandatory).
QRegExp ipRegex ("^" + ipRange
                 + "\\." + ipRange
                 + "\\." + ipRange
                 + "\\." + ipRange + "$");
QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
lineEdit->setValidator(ipValidator);

免责声明:这只会正确验证IP4地址,因此如果您将来需要,它将不适用于IP6。

您好,我几乎遇到了相同的问题。使用inputmask或regExp的解决方案不令人满意。我决定自己做自行车

标题:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QFrame>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

//=============================================================================
class CustomIpEditor : public QFrame
{
    Q_OBJECT
public:
    explicit CustomIpEditor(QWidget *parent = 0);
    virtual ~CustomIpEditor() {}
};

//=============================================================================
class CustomLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit CustomLineEdit(const QString & contents = "", QWidget *parent = 0);
    virtual ~CustomLineEdit() {}

signals:
    void jumpForward();
    void jumpBackward();

public slots:
    void jumpIn();

protected:
    virtual void focusInEvent(QFocusEvent *event);
    virtual void keyPressEvent(QKeyEvent * event);
    virtual void mouseReleaseEvent(QMouseEvent *event);

private:
    bool selectOnMouseRelease;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
Ui::MainWindow*Ui;
};
//=============================================================================
类CustomIpEditor:公共QFrame
{
Q_对象
公众:
显式CustomIpEditor(QWidget*parent=0);
虚拟~CustomIpEditor(){}
};
//=============================================================================
类CustomLineEdit:公共QLineEdit
{
Q_对象
公众:
显式CustomLineEdit(const QString&contents=“”,QWidget*parent=0);
虚拟~CustomLineEdit(){}
信号:
无效向前跳();
void jumpBackward();
公众时段:
无效跳跃();
受保护的:
虚拟无效焦点事件(QFocusEvent*事件);
虚拟无效按键事件(QKeyEvent*事件);
虚拟无效mouseReleaseEvent(QMouseEvent*事件);
私人:
bool选择鼠标释放;
};
#endif//main窗口
资料来源:

#include <QVBoxLayout>
#include <QKeyEvent>

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    centralWidget()->setLayout(new QVBoxLayout);

    CustomIpEditor *myed = new CustomIpEditor;
    centralWidget()->layout()->addWidget(myed);

}

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

//=============================================================================
CustomLineEdit::CustomLineEdit(const QString & contents, QWidget *parent) :
    QLineEdit(contents, parent), selectOnMouseRelease(false)
{
    QIntValidator *valid = new QIntValidator(0, 255, this);
    setValidator(valid);
}

void CustomLineEdit::jumpIn()
{
    setFocus();

    selectOnMouseRelease = false;
    selectAll();
}

void CustomLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    selectOnMouseRelease = true;
}

void CustomLineEdit::keyPressEvent(QKeyEvent * event)
{
    int key = event->key();
    int cursorPos = cursorPosition();

    // Jump forward by Space
    if (key == Qt::Key_Space) {
        emit jumpForward();
        event->accept();
        return;
    }

    // Jump Backward only from 0 cursor position
    if (cursorPos == 0) {
        if ((key == Qt::Key_Left) || (key == Qt::Key_Backspace)) {
            emit jumpBackward();
            event->accept();
            return;
        }
    }

    // Jump forward from last postion by right arrow
    if (cursorPos == text().count()) {
        if (key == Qt::Key_Right) {
            emit jumpForward();
            event->accept();
            return;
        }
    }

    // After key is placed cursor has new position
    QLineEdit::keyPressEvent(event);
    int freshCurPos = cursorPosition();

    if ((freshCurPos == 3) && (key != Qt::Key_Right))
        emit jumpForward();
}

void CustomLineEdit::mouseReleaseEvent(QMouseEvent *event)
{
    if(!selectOnMouseRelease)
        return;

    selectOnMouseRelease = false;
    selectAll();

    QLineEdit::mouseReleaseEvent(event);
}

//=============================================================================
void makeCommonStyle(QLineEdit* line) {
    line->setContentsMargins(0, 0, 0, 0);
    line->setAlignment(Qt::AlignCenter);
    line->setStyleSheet("QLineEdit { border: 0px none; }");
    line->setFrame(false);
    line->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}

QLineEdit* makeIpSpliter() {
    QLineEdit *spliter = new QLineEdit(".");
    makeCommonStyle(spliter);

    spliter->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    spliter->setMaximumWidth(10);
    spliter->setReadOnly(true);
    spliter->setFocusPolicy(Qt::NoFocus);
    return spliter;
}

CustomIpEditor::CustomIpEditor(QWidget *parent) :
    QFrame(parent)
{
    setContentsMargins(0, 0, 0, 0);
    setStyleSheet("QFrame { background-color: white;  border: 1px solid white; border-radius: 15px; }");

    QList <CustomLineEdit *>  lines;
    QList <CustomLineEdit *>::iterator linesIterator;

    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->setSpacing(0);
    setLayout(mainLayout);

    for (linesIterator = lines.begin(); linesIterator != lines.end(); ++linesIterator) {
        makeCommonStyle(*linesIterator);
        mainLayout->addWidget(*linesIterator);

        if (*linesIterator != lines.last()) {
            connect(*linesIterator, &CustomLineEdit::jumpForward,
                    *(linesIterator+1), &CustomLineEdit::jumpIn);
            mainLayout->addWidget(makeIpSpliter());
        }
        if (*linesIterator != lines.first()) {
            connect(*linesIterator, &CustomLineEdit::jumpBackward,
                    *(linesIterator-1), &CustomLineEdit::jumpIn);
        }
    }

}
#包括
#包括
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
centralWidget()->setLayout(新的QVBoxLayout);
CustomIpEditor*myed=新的CustomIpEditor;
centralWidget()->layout()->addWidget(myed);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
//=============================================================================
CustomLineEdit::CustomLineEdit(常量QString&contents,QWidget*父项):
QLineEdit(内容,父项),选择OnMouseRelease(false)
{
QIntValidator*valid=新的QIntValidator(0,255,此值);
setValidator(有效);
}
void CustomLineEdit::jumpIn()
{
setFocus();
selectOnMouseRelease=false;
选择全部();
}
作废CustomLineEdit::FocusineEvent(QFocusEvent*事件)
{
QLineEdit::focusInEvent(事件);
选择onmouseRelease=true;
}
作废CustomLineEdit::keyPressEvent(QKeyEvent*事件)
{
int key=event->key();
int cursorPos=cursorPosition();
//太空跳跃
if(key==Qt::key\u空间){
发射前跳();
事件->接受();
返回;
}
//仅从0光标位置向后跳转
if(cursorPos==0){
if((key==Qt::key_Left)| |(key==Qt::key_Backspace)){
向后发射跳跃();
事件->接受();
返回;
}
}
//用右箭头从最后一个位置向前跳
if(cursorPos==text().count()){
if(key==Qt::key\u Right){
发射前跳();
事件->接受();
返回;
}
}
//放置关键点后,光标具有新位置
QLineEdit::按键事件(事件);
int freshCurPos=cursorPosition();
if((freshCurPos==3)和&(key!=Qt::key_Right))
发射前跳();
}
void CustomLineEdit::mouseReleaseEvent(QMouseEvent*事件)
{
如果(!selectOnMouseRelease)
返回;
selectOnMouseRelease=false;
选择全部();
QLineEdit::mouseReleaseEvent(事件);
}
//=============================================================================
void MakeCommonsStyle(QLineEdit*行){
行->设置内容边缘(0,0,0,0);
line->setAlignment(Qt::AlignCenter);
行->设置样式表(“QLineEdit{border:0px none;}”);
行->设置帧(假);
行->设置策略(QSizePolicy::Expansing,QSizePolicy::Preferred);
}
QLineEdit*makeIpSpliter(){
QLineEdit*拆分器=新的QLineEdit(“.”);
makeCommonStyle(拆分器);
拆分器->设置策略(QSizePolicy::首选,QSizePolicy::首选);
拆分器->设置最大宽度(10);
拆分器->设置只读(真);
spliter->setFocusPolicy(Qt::NoFocus);
回流分离器;
}
CustomIpEditor::CustomIpEditor(QWidget*父项):
QFrame(父级)
{
setContentsMargins(0,0,0,0);
setStyleSheet(“QFrame{背景色:白色;边框:1px纯白;边框半径:15px;}”);
QList行;
迭代器linesIterator;
行。追加(新的CustomLineEdit);
行。追加(新的CustomLineEdit);
行。追加(新的CustomLineEdit);
行。追加(新的CustomLineEdit);
QHBoxLayout*mainLayout=新的QHBoxLayout;
主布局->设置间距(0);
设置布局(主布局);
对于(linesIterator=lines.begin();linesIterator!=lines.end();++linesIterator){
MakeCommonsStyle(*linesIterator);
mainLayout->addWidget(*linesIterator);
如果(*linesIterator!=lines.last()){
connect(*linesIterator,&CustomLineEdit::jumpForward,
*(linesIterator+1),&CustomLineEdit::jumpIn);
mainLayout->addWidget(makeIpSpliter());
}
如果(*linesIterator!=lines.first()){
connect(*linesIterator,&CustomLineEdit::jumpBackward,
*(
#include <QVBoxLayout>
#include <QKeyEvent>

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    centralWidget()->setLayout(new QVBoxLayout);

    CustomIpEditor *myed = new CustomIpEditor;
    centralWidget()->layout()->addWidget(myed);

}

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

//=============================================================================
CustomLineEdit::CustomLineEdit(const QString & contents, QWidget *parent) :
    QLineEdit(contents, parent), selectOnMouseRelease(false)
{
    QIntValidator *valid = new QIntValidator(0, 255, this);
    setValidator(valid);
}

void CustomLineEdit::jumpIn()
{
    setFocus();

    selectOnMouseRelease = false;
    selectAll();
}

void CustomLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    selectOnMouseRelease = true;
}

void CustomLineEdit::keyPressEvent(QKeyEvent * event)
{
    int key = event->key();
    int cursorPos = cursorPosition();

    // Jump forward by Space
    if (key == Qt::Key_Space) {
        emit jumpForward();
        event->accept();
        return;
    }

    // Jump Backward only from 0 cursor position
    if (cursorPos == 0) {
        if ((key == Qt::Key_Left) || (key == Qt::Key_Backspace)) {
            emit jumpBackward();
            event->accept();
            return;
        }
    }

    // Jump forward from last postion by right arrow
    if (cursorPos == text().count()) {
        if (key == Qt::Key_Right) {
            emit jumpForward();
            event->accept();
            return;
        }
    }

    // After key is placed cursor has new position
    QLineEdit::keyPressEvent(event);
    int freshCurPos = cursorPosition();

    if ((freshCurPos == 3) && (key != Qt::Key_Right))
        emit jumpForward();
}

void CustomLineEdit::mouseReleaseEvent(QMouseEvent *event)
{
    if(!selectOnMouseRelease)
        return;

    selectOnMouseRelease = false;
    selectAll();

    QLineEdit::mouseReleaseEvent(event);
}

//=============================================================================
void makeCommonStyle(QLineEdit* line) {
    line->setContentsMargins(0, 0, 0, 0);
    line->setAlignment(Qt::AlignCenter);
    line->setStyleSheet("QLineEdit { border: 0px none; }");
    line->setFrame(false);
    line->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}

QLineEdit* makeIpSpliter() {
    QLineEdit *spliter = new QLineEdit(".");
    makeCommonStyle(spliter);

    spliter->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    spliter->setMaximumWidth(10);
    spliter->setReadOnly(true);
    spliter->setFocusPolicy(Qt::NoFocus);
    return spliter;
}

CustomIpEditor::CustomIpEditor(QWidget *parent) :
    QFrame(parent)
{
    setContentsMargins(0, 0, 0, 0);
    setStyleSheet("QFrame { background-color: white;  border: 1px solid white; border-radius: 15px; }");

    QList <CustomLineEdit *>  lines;
    QList <CustomLineEdit *>::iterator linesIterator;

    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);
    lines.append(new CustomLineEdit);

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->setSpacing(0);
    setLayout(mainLayout);

    for (linesIterator = lines.begin(); linesIterator != lines.end(); ++linesIterator) {
        makeCommonStyle(*linesIterator);
        mainLayout->addWidget(*linesIterator);

        if (*linesIterator != lines.last()) {
            connect(*linesIterator, &CustomLineEdit::jumpForward,
                    *(linesIterator+1), &CustomLineEdit::jumpIn);
            mainLayout->addWidget(makeIpSpliter());
        }
        if (*linesIterator != lines.first()) {
            connect(*linesIterator, &CustomLineEdit::jumpBackward,
                    *(linesIterator-1), &CustomLineEdit::jumpIn);
        }
    }

}
ui->lineEdit_IP->setInputMask( "000.000.000.000" );
QHostAddress myIP;
   if( myIP.setAddress( ui->lineEdit_IP->text()) )
   qDebug()<<"Valid IP Address";
   else
   qDebug()<<"Invalid IP address";
QString ipRange = "(([ 0]+)|([ 0]*[0-9] *)|([0-9][0-9] )|([ 0][0-9][0-9])|(1[0-9][0-9])|([2][0-4][0-9])|(25[0-5]))";
// You may want to use QRegularExpression for new code with Qt 5 (not mandatory).
QRegExp ipRegex ("^" + ipRange
                 + "\\." + ipRange
                 + "\\." + ipRange
                 + "\\." + ipRange + "$");
QRegExpValidator *ipValidator = new QRegExpValidator(ipRegex, this);
lineEdit->setValidator(ipValidator);
lineEdit->setInputMask("000.000.000.000");
// Avoid having to move cursor before typing
linEdit->setCursorPosition(0);
ui->lineEdit->setText(myIP->toString());