Qt 自定义IP输入控件

272 阅读2分钟

最近遇到一个需要IP端口的需求,而且量并不少,每次在对这个输入框处理的时候很麻烦,想着是不是可以独立出来一个单独的控件,方便以后使用,试着找了几种方法来实现一下。

1、使用QLineEdit的inputMask方法

使用该方法比较简单,一种是直接在designer界面中输入,另一种是通过代码进行设置,其中比较重要的是mask的格式。mask 格式如下:000.000.000.000

使用这种方式能够正常的输入IP,但存在的问题是,设置完mask之后,就相当于对QLineEdit进行了占位,每一格都是三位,假设输入172.0.0.1这种ip的时候就会显得不是那么好看。如下图:

在这里插入图片描述

2使用正则表达式

这种方式一般是最常用的,简单明了,并且可以很准确的限定IP的输入。我们使用QLineEdit和QSpinBox的组合,来组成IP和端口的输入。如下图所示: 在这里插入图片描述

class IpConfigWidget : public QWidget
{
	Q_OBJECT
	Q_PROPERTY(QString ip READ ip WRITE setIp DESIGNABLE true)
	Q_PROPERTY(int port READ port WRITE setPort DESIGNABLE true)

public:

	QString ip() const;
	void setIp(const QString& ip);
	int port() const;
	void setPort(const int& port);
};

使用自定义属性方式对我们自己的控件进行封装,这样后续调用的话会比较方便。

这样我们只需要在构造函数里面对QLineEdit设置正则就行了:

IpConfigWidget::IpConfigWidget(QWidget *parent) :QWidget(parent), ui(new Ui::IpConfigWidget)
{
    ui->setupUi(this);
    ui->spinBox->clear();

    QRegExp rx("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$");
    QRegExpValidator* ipValidator = new QRegExpValidator(rx, this);
    ui->lineEdit->setValidator(ipValidator);
}

IP的获取和设置:

QString IpConfigWidget::ip() const
{
    QString ip = ui->lineEdit->text();
    return ip;
}

void IpConfigWidget::setIp(const QString& ip)
{
    ui->lineEdit->setText(ip);
}

端口的获取和设置也是一样的,需要注意的一点是,QSpinBox调用clear()方法之后,只是表面的清空了显示的数据,而它的value()方法还是能够正常的获取到数值。

源码地址:gitee.com/Gqian_com/c…