2014-04-19 5 views
6

मुझे एक लाइन संपादन चाहिए जो एक आईपी पता स्वीकार करता है। अगर मैं इनपुट मुखौटा देने के रूप में: (।)क्यूटी में एक समय में एक QLineEdit में इनपुट मास्क और QValidator कैसे सेट करें?

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

यह 255 से अधिक मान स्वीकार कर रहा है अगर मैं एक सत्यापनकर्ता दे तो हम हर तीन अंकों के बाद एक डॉट देना पड़ता है। इसे संभालने का सबसे अच्छा तरीका क्या होगा?

उत्तर

12

यह मूल्य से अधिक 255.

बिल्कुल स्वीकार कर रहा है, क्योंकि '0' का मतलब है this:

ASCII digit permitted but not required. 

आप देख सकते हैं, इस चाय के अपने कप नहीं है। वहाँ कम से कम निम्नलिखित यह नाकाम करने के लिए तरीके हैं:

  • एक कस्टम सत्यापनकर्ता लिखें

  • उपयोग regex

  • स्प्लिट चार प्रविष्टियों में इनपुट और अपने दम पर प्रत्येक प्रविष्टि को मान्य, जबकि अभी भी हो रही प्रविष्टियों के बीच दृश्य delimiters।

    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 लिए काम नहीं करेगा आप में है कि आवश्यकता चाहिए

regex समाधान शायद जल्दी, लेकिन यह भी ugliest IMHO होगा भविष्य।

4

हाय मुझे लगभग एक ही समस्या थी। इनपुटमास्क या 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 

स्रोत:

#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

बस शानदार और मुझे वास्तव में क्या चाहिए। धन्यवाद! – ervinbosenbacher

1

आसान विधि

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

और अपने सत्यापन कोड में विकल्प inputmask कोशिश है निम्नलिखित सरल हालत

का उपयोग
संबंधित मुद्दे