【问题标题】:How to set Input Mask and QValidator to a QLineEdit at a time in Qt?如何在 Qt 中一次将 Input Mask 和 QValidator 设置为 QLineEdit?
【发布时间】:2014-06-03 16:20:51
【问题描述】:

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

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

它接受大于 255 的值。如果我给出一个验证器,那么我们必须在每三位数字之后给出一个点 (.)。最好的处理方法是什么?

【问题讨论】:

    标签: c++ qt qtgui qtcore qlineedit


    【解决方案1】:

    接受大于 255 的值。

    当然,因为“0”表示this

    ASCII digit permitted but not required.
    

    如您所见,这不是您的一杯茶。至少有以下几种方法可以规避:

    • 编写自定义验证器

    • 使用正则表达式

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

    正则表达式解决方案可能是最快的,但也是最丑陋的恕我直言:

    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。

    【讨论】:

      【解决方案2】:

      更简单的方法是尝试输入掩码选项

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

      【讨论】:

        【解决方案3】:

        您好,我遇到了几乎同样的问题。带有 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
        

        来源:

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

        【讨论】:

          【解决方案4】:

          对于那些想知道 QT doku 中的以下提示的人:

          要获得范围控制(例如,对于 IP 地址),请将掩码与验证器一起使用。

          在这种情况下,验证器需要处理空白。我的解决方案改编自lpapp's answer 和这个Qt forum post,因此内容如下:

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

          我是使用正则表达式的初学者,请随时提出改进建议。

          【讨论】:

            【解决方案5】:

            根据 Arun Kumar K S 的回答:

            如果myIP.setAddress()成功,你可以将ip写回行编辑作为格式化字符串:

            ui->lineEdit->setText(myIP->toString());
            

            因此,您不一定需要设置掩码(也不需要验证器或正则表达式)。

            注意 如果它无法读取 IP,setAddress() 也会写入/覆盖您的 myIP。因此,在这种情况下调用 toString() 会导致一个空字符串。

            【讨论】:

              猜你喜欢
              • 2014-04-19
              • 2010-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多