Qt escribiendo cuadro de entrada de dirección IP de control personalizado

I. Introducción

Este control del cuadro de entrada de dirección IP probablemente esté mal escrito. Una búsqueda aleatoria en Internet arrojará muchos resultados. Probablemente se deba a que este control es demasiado fácil y es muy adecuado para que los principiantes practiquen. La idea general es usar 4 Controles qlineedit para juntarlos, y luego Cada cuadro de entrada se configura con filtrado de expresiones regulares para permitir que solo se ingresen 3 dígitos, y luego se instala un filtro de eventos para reconocer el retorno de carro y saltar automáticamente al siguiente cuadro de entrada. En cuanto a cómo configurar el filtrado de expresiones regulares, puedes encontrarlo buscando. No entiendo muy bien esta regla. Parece que hay libros especiales dedicados a las expresiones regulares. Esto puede ser muy poderoso.

Dirección de código abierto: https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo

2. Funciones implementadas

  • 1: Se puede configurar la dirección IP y el cuadro se completará automáticamente
  • 2: la dirección IP se puede borrar
  • 3: Admite cambio automático presionando el punto pequeño
  • 4: admite el cambio automático de la tecla de retroceso
  • 5: Admite filtrado de direcciones IP
  • 6: Se puede configurar el color de fondo/color del borde/ángulo de filete del borde

3. Dibujo de efectos

4. Código del archivo de encabezado

#ifndef IPADDRESS_H
#define IPADDRESS_H

/**
 * IP地址输入框控件 作者:feiyangqingyun(QQ:517216493) 2017-8-11
 * 1:可设置IP地址,自动填入框
 * 2:可清空IP地址
 * 3:支持按下小圆点自动切换
 * 4:支持退格键自动切换
 * 5:支持IP地址过滤
 * 6:可设置背景色/边框颜色/边框圆角角度
 */

#include <QWidget>

class QLabel;
class QLineEdit;

#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif

class QDESIGNER_WIDGET_EXPORT IPAddress : public QWidget
#else
class IPAddress : public QWidget
#endif

{
    Q_OBJECT
    Q_PROPERTY(QString ip READ getIP WRITE setIP)

public:
    explicit IPAddress(QWidget *parent = 0);

protected:
    bool eventFilter(QObject *watched, QEvent *event);

private:
    QLabel *labDot1;    //第一个小圆点
    QLabel *labDot2;    //第二个小圆点
    QLabel *labDot3;    //第三个小圆点

    QLineEdit *txtIP1;  //IP地址网段输入框1
    QLineEdit *txtIP2;  //IP地址网段输入框2
    QLineEdit *txtIP3;  //IP地址网段输入框3
    QLineEdit *txtIP4;  //IP地址网段输入框4

    QString ip;         //IP地址
    QString bgColor;    //背景颜色
    QString borderColor;//边框颜色
    int borderRadius;   //边框圆角角度

private slots:
    void textChanged(const QString &text);

public:
    //获取IP地址
    QString getIP()                 const;

    QSize sizeHint()                const;
    QSize minimumSizeHint()         const;

public Q_SLOTS:
    //设置IP地址
    void setIP(const QString &ip);
    //清空
    void clear();

    //设置背景颜色
    void setBgColor(const QString &bgColor);
    //设置边框颜色
    void setBorderColor(const QString &borderColor);
    //设置边框圆角角度
    void setBorderRadius(int borderRadius);

};

#endif // IPADDRESS_H


Como beneficio de este artículo, puede recibir un paquete de aprendizaje de desarrollo de Qt y videos técnicos de forma gratuita, que incluyen (conceptos básicos del lenguaje C++, introducción a la programación de Qt, mecanismo de ranura y señal de QT, dibujo de imágenes de desarrollo de interfaz de QT, red de QT, base de datos de QT). programación, práctica de proyectos QT , para recibir la tarifa↓↓

5. Código central

#pragma execution_character_set("utf-8")

#include "ipaddress.h"
#include "qlabel.h"
#include "qlineedit.h"
#include "qboxlayout.h"
#include "qregexp.h"
#include "qvalidator.h"
#include "qevent.h"
#include "qdebug.h"

IPAddress::IPAddress(QWidget *parent) : QWidget(parent)
{
    bgColor = "#FFFFFF";
    borderColor = "#A6B5B8";
    borderRadius = 3;

    //用于显示小圆点的标签,居中对齐
    labDot1 = new QLabel;
    labDot1->setAlignment(Qt::AlignCenter);
    labDot1->setText(".");

    labDot2 = new QLabel;
    labDot2->setAlignment(Qt::AlignCenter);
    labDot2->setText(".");

    labDot3 = new QLabel;
    labDot3->setAlignment(Qt::AlignCenter);
    labDot3->setText(".");

    //用于输入IP地址的文本框,居中对齐
    txtIP1 = new QLineEdit;
    txtIP1->setObjectName("txtIP1");
    txtIP1->setAlignment(Qt::AlignCenter);
    txtIP1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    connect(txtIP1, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));

    txtIP2 = new QLineEdit;
    txtIP2->setObjectName("txtIP2");
    txtIP2->setAlignment(Qt::AlignCenter);
    txtIP2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    connect(txtIP2, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));

    txtIP3 = new QLineEdit;
    txtIP3->setObjectName("txtIP3");
    txtIP3->setAlignment(Qt::AlignCenter);
    txtIP3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    connect(txtIP3, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));

    txtIP4 = new QLineEdit;
    txtIP4->setObjectName("txtIP4");
    txtIP4->setAlignment(Qt::AlignCenter);
    txtIP4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    connect(txtIP4, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));

    //设置IP地址校验过滤
    QRegExp regExp("(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})");
    QRegExpValidator *validator = new QRegExpValidator(regExp, this);
    txtIP1->setValidator(validator);
    txtIP2->setValidator(validator);
    txtIP3->setValidator(validator);
    txtIP4->setValidator(validator);

    //绑定事件过滤器,识别键盘按下
    txtIP1->installEventFilter(this);
    txtIP2->installEventFilter(this);
    txtIP3->installEventFilter(this);
    txtIP4->installEventFilter(this);

    QFrame *frame = new QFrame;
    frame->setObjectName("frameIP");

    QStringList qss;
    qss.append(QString("QFrame#frameIP{border:1px solid %1;border-radius:%2px;}").arg(borderColor).arg(borderRadius));
    qss.append(QString("QLabel{min-width:15px;background-color:%1;}").arg(bgColor));
    qss.append(QString("QLineEdit{background-color:%1;border:none;}").arg(bgColor));
    qss.append(QString("QLineEdit#txtIP1{border-top-left-radius:%1px;border-bottom-left-radius:%1px;}").arg(borderRadius));
    qss.append(QString("QLineEdit#txtIP4{border-top-right-radius:%1px;border-bottom-right-radius:%1px;}").arg(borderRadius));
    frame->setStyleSheet(qss.join(""));

    QVBoxLayout *verticalLayout = new QVBoxLayout(this);
    verticalLayout->setMargin(0);
    verticalLayout->setSpacing(0);
    verticalLayout->addWidget(frame);

    //将控件按照横向布局排列
    QHBoxLayout *layout = new QHBoxLayout(frame);
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addWidget(txtIP1);
    layout->addWidget(labDot1);
    layout->addWidget(txtIP2);
    layout->addWidget(labDot2);
    layout->addWidget(txtIP3);
    layout->addWidget(labDot3);
    layout->addWidget(txtIP4);
}

bool IPAddress::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {
        QLineEdit *txt = (QLineEdit *)watched;
        if (txt == txtIP1 || txt == txtIP2 || txt == txtIP3 || txt == txtIP4) {
            QKeyEvent *key = (QKeyEvent *)event;

            //如果当前按下了小数点则移动焦点到下一个输入框
            if (key->text() == ".") {
                this->focusNextChild();
            }

            //如果按下了退格键并且当前文本框已经没有了内容则焦点往前移
            if (key->key() == Qt::Key_Backspace) {
                if (txt->text().length() <= 1) {
                    this->focusNextPrevChild(false);
                }
            }
        }
    }

    return QWidget::eventFilter(watched, event);
}

void IPAddress::textChanged(const QString &text)
{
    int len = text.length();
    int value = text.toInt();

    //判断当前是否输入完成一个网段,是的话则自动移动到下一个输入框
    if (len == 3) {
        if (value >= 100 && value <= 255) {
            this->focusNextChild();
        }
    }

    //拼接成完整IP地址
    ip = QString("%1.%2.%3.%4").arg(txtIP1->text()).arg(txtIP2->text()).arg(txtIP3->text()).arg(txtIP4->text());
}

QString IPAddress::getIP() const
{
    return this->ip;
}

QSize IPAddress::sizeHint() const
{
    return QSize(250, 20);
}

QSize IPAddress::minimumSizeHint() const
{
    return QSize(30, 10);
}

void IPAddress::setIP(const QString &ip)
{
    //先检测IP地址是否合法
    QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
    if (!regExp.exactMatch(ip)) {
        return;
    }

    if (this->ip != ip) {
        this->ip = ip;

        //将IP地址填入各个网段
        QStringList list = ip.split(".");
        txtIP1->setText(list.at(0));
        txtIP2->setText(list.at(1));
        txtIP3->setText(list.at(2));
        txtIP4->setText(list.at(3));
    }
}

void IPAddress::clear()
{
    txtIP1->clear();
    txtIP2->clear();
    txtIP3->clear();
    txtIP4->clear();
    txtIP1->setFocus();
}

void IPAddress::setBgColor(const QString &bgColor)
{
    if (this->bgColor != bgColor) {
        this->bgColor = bgColor;
    }
}

void IPAddress::setBorderColor(const QString &borderColor)
{
    if (this->borderColor != borderColor) {
        this->borderColor = borderColor;
    }
}

void IPAddress::setBorderRadius(int borderRadius)
{
    if (this->borderRadius != borderRadius) {
        this->borderRadius = borderRadius;
    }
}


6. Introducción al control

  1. Más de 160 controles exquisitos, que cubren varios paneles, barras de progreso, bolas de progreso, brújulas, curvas, reglas, termómetros, barras de navegación, barras de navegación, flatui, botones resaltados, selectores deslizantes, calendario lunar, etc. Supera con creces el número de controles integrados por qwt.
  2. Cada clase se puede formar de forma independiente en un control separado, con acoplamiento cero. Cada control tiene un archivo de encabezado y un archivo de implementación, y no depende de otros archivos. Es conveniente que un solo control se integre en el proyecto en la forma de código fuente, con menos código. Las clases de control de qwt están entrelazadas y altamente acopladas. Si desea utilizar uno de los controles, debe incluir todo el código.
  3. Todo escrito en Qt puro, dibujado por QWidget+QPainter, admite cualquier versión de Qt desde Qt4.6 a Qt5.13, admite compiladores como mingw, msvc, gcc, etc., y admite cualquier sistema operativo como windows+linux+mac. + Linux incorporado, etc., sin código confuso, se puede integrar directamente en Qt Creator y usarse como los controles integrados. La mayoría de los efectos solo necesitan configurar algunas propiedades, lo cual es extremadamente conveniente.
  4. Cada control tiene una DEMO independiente correspondiente que contiene el código fuente del control para una fácil referencia y uso. También proporciona una DEMO integrada utilizada por todos los controles.
  5. El código fuente de cada control tiene comentarios chinos detallados y está escrito de acuerdo con especificaciones de diseño unificadas, lo que facilita aprender a escribir controles personalizados.
  6. La combinación de colores predeterminada de cada control y la combinación de colores correspondiente a la demostración son muy exquisitas.
  7. Más de 130 controles visibles y 6 controles invisibles.
  8. Algunos controles ofrecen múltiples opciones de estilo y múltiples opciones de estilo de indicador.
  9. Todos los controles se adaptan para formar cambios de estiramiento.
  10. Diseñador de atributos de control personalizado integrado, admite diseño de arrastrar y soltar, WYSIWYG, admite importación y exportación de formato xml.
  11. Viene con una demostración de control ActiveX, todos los controles se pueden ejecutar directamente en el navegador IE.
  12. Integre fuentes gráficas fontawesome + cientos de fuentes gráficas recopiladas por Alibaba iconfont y disfrute de la diversión que brindan las fuentes gráficas.
  13. Todos los controles finalmente generan un archivo de biblioteca dinámica (dll o algo así, etc.), que se puede integrar directamente en qtcreator para el diseño de arrastrar y soltar.
  14. Ya existe una versión qml y más adelante se considerará una versión pyqt si hay una gran demanda por parte de los usuarios.
  15. El complemento de control personalizado está abierto al uso de la biblioteca dinámica (gratuito para siempre), sin puertas traseras ni restricciones, así que no dude en utilizarlo.
  16. Actualmente, se han proporcionado 32 versiones de dll, entre las cuales siempre se garantizará que la versión qt_5_7_0_mingw530_32 será la más reciente y completa.
  17. Los controles se agregan y mejoran de vez en cuando, y el SDK se actualiza de vez en cuando. Las sugerencias son bienvenidas, ¡gracias!
  18. Para libros introductorios de Qt, recomendamos "Inicio rápido con Qt Creator" e "Introducción a la programación Qt5" de Huo Yafei. Para libros avanzados de Qt, recomendamos la "Programación Qt4 GUI C ++ oficial".
  19. Recomiendo encarecidamente la serie de libros de planificación y autocultivo para programadores, "The Big Talk Programmer", "Programmer's Growth Course" y "The Worry-Relieving Programmer", que le beneficiarán mucho y le durarán toda la vida.
  20. Dirección del SDK: https://gitee.com/feiyangqingyun/QUCSDK https://github.com/feiyangqingyun/qucsdk

Enlace original: https://www.cnblogs.com/feiyangqingyun/p/11665022.html

Como beneficio de este artículo, puede recibir un paquete de aprendizaje de desarrollo de Qt y videos técnicos de forma gratuita, que incluyen (conceptos básicos del lenguaje C++, introducción a la programación de Qt, mecanismo de ranura y señal de QT, dibujo de imágenes de desarrollo de interfaz de QT, red de QT, base de datos de QT). programación, práctica de proyectos QT , para recibir la tarifa↓↓

Supongo que te gusta

Origin blog.csdn.net/hw5230/article/details/132864591
Recomendado
Clasificación