最近遇到一个需要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()方法还是能够正常的获取到数值。
源码地址:https://gitee.com/Gqian_com/customcomponent/tree/master/ipconfig