2014-04-19 22 views

risposta

12

Si sta accettando valore maggiore di 255.

Assolutamente, perché '0' significa this:

ASCII digit permitted but not required. 

Come si può vedere, questa non è la vostra tazza di tè. Ci sono almeno i seguenti modi per aggirare esso:

  • Scrivi un validatore personalizzato

  • Usa espressione regolare

  • Spalato l'ingresso in quattro voci e confermare ogni voce sulla propria, pur avendo delimitatori visivi tra le voci.

La soluzione regex sarebbe probabilmente il veloce, ma anche più brutto secondo me:

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

Esonero di responsabilità: questo sarà solo convalidare IP4 rivolge correttamente, in modo che non funzionerà per IP6 se ​​avete bisogno che nel il futuro.

4

Ciao, ho quasi avuto lo stesso problema. Le soluzioni con maschera di input o regExp non erano soddisfacenti. Ho deciso di fare la mia bicicletta.

Intestazione:

#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 

Fonte:

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

} 
+0

Semplicemente geniale e ciò di cui avevo davvero bisogno. Grazie! – ervinbosenbacher

1

Il metodo più semplice è provare InputMask opzione

ui->lineEdit_IP->setInputMask("000.000.000.000"); 

e nel codice di validazione utilizzare il seguente semplice condizione di

QHostAddress myIP; 
    if(myIP.setAddress(ui->lineEdit_IP->text())) 
    qDebug()<<"Valid IP Address"; 
    else 
    qDebug()<<"Invalid IP address";