QT 自定义IP输入框(自己重写一部分,增加一部分功能)
2017-11-27 14:45
423 查看
QT没有提供一个完整的IP地址控件,
1. 可以使用QLineEdit简单的实现
QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator *pValidator = new QRegExpValidator(regExp, this);
QLineEdit *lineEdit = new QLineEdit(this);
lineEdit->setValidator(new QRegExpValidator(pValidator, this));
lineEdit->setInputMask("000.000.000.000;");
但是上面的输入时没有window的IP地址控件好用。所以自己就用4个QLineEdit封装了一个,用起来好多了,
下面是代码:
// MyIpPartLineEdit.h
#pragma once
#include <QLineEdit>
class QWidget;
class QFocusEvent;
class QKeyEvent;
class MyIpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyIpPartLineEdit(QWidget *parent = 0);
~MyIpPartLineEdit(void);
void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }
void set_beforetab_del(QLineEdit *beforetab) { before_tab_ = beforetab;}
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void keyPressEvent(QKeyEvent *event);
private slots:
void text_edited(const QString& text);
private:
QLineEdit *next_tab_;
QLineEdit *before_tab_;
};
// MyIpPartLineEdit.cpp
#include "MyIpPartLineEdit.h"
#include <QIntValidator>
#include <QKeyEvent>
MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/)
: QLineEdit(parent)
{
next_tab_ = NULL;
this->setMaxLength(3);
this->setFrame(false);
this->setAlignment(Qt::AlignCenter);
QValidator *validator = new QIntValidator(0, 255, this);
this->setValidator(validator);
connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
}
MyIpPartLineEdit::~MyIpPartLineEdit(void)
{
}
void MyIpPartLineEdit::focusInEvent(QFocusEvent *e)
{
this->selectAll();
QLineEdit::focusInEvent(e);
}
void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Period)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
//ccg 使删除完当前文本框以后跳到前一个文本框
if (event->key() == Qt::Key_Backspace)
{
while ((this->text().size() == 0)&&(this->objectName() != "ip_part1_"))
{
if (before_tab_)
{
before_tab_->setFocus();
return;
}
}
}
//CCG左键跳到前一个编辑框最右位置
if(event->key() == Qt::Key_Left)
{
if ((this->cursorPosition() ==0)&&(this->objectName() != "ip_part1_"))
{
if (before_tab_)
{
before_tab_->setFocus();
before_tab_->setCursorPosition(this->text().size());
return;
}
}
}
if(event->key() == Qt::Key_Right)
{
if ((this->cursorPosition() ==this->text().size())&&(this->objectName() != "ip_part4_"))
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->setCursorPosition(0);
return;
}
}
}
QLineEdit::keyPressEvent(event);
}
void MyIpPartLineEdit::text_edited(const QString& text)
{
QIntValidator v(0, 255, this);
QString ipaddr = text;
int pos = 0;
QValidator::State state = v.validate(ipaddr, pos);
if (state == QValidator::Acceptable)
{
if (ipaddr.size() > 1)
{
if (ipaddr.size() == 2)
{
int ipnum = ipaddr.toInt();
if (ipnum > 25)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
else
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
}
}
// MyIpAddrEdit.h
#pragma once
#include <QWidget>
class QLineEdit;
class QLabel;
class MyIpPartLineEdit;
class MyIpAddrEdit : public QWidget
{
Q_OBJECT
public:
MyIpAddrEdit(QWidget* pParent = 0);
~MyIpAddrEdit();
void settext(const QString &text);
QString text();
void setStyleSheet(const QString &styleSheet);
signals:
void textchanged(const QString& text);
void textedited(const QString &text);
private slots:
void textchangedslot(const QString& text);
void texteditedslot(const QString &text);
private:
MyIpPartLineEdit *ip_part1_;
MyIpPartLineEdit *ip_part2_;
MyIpPartLineEdit *ip_part3_;
MyIpPartLineEdit *ip_part4_;
QLabel *labeldot1_;
QLabel *labeldot2_;
QLabel *labeldot3_;
};
// MyIpAddrEdit.cpp
#include "MyIpAddrEdit.h"
#include <QRegExpValidator>
#include <QLabel>
#include "MyIpPartLineEdit.h"
MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
: QWidget(pParent)
{
ip_part1_ = new MyIpPartLineEdit(this);
ip_part2_ = new MyIpPartLineEdit(this);
ip_part3_ = new MyIpPartLineEdit(this);
ip_part4_ = new MyIpPartLineEdit(this);
labeldot1_ = new QLabel(this);
labeldot2_ = new QLabel(this);
labeldot3_ = new QLabel(this);
ip_part1_->setGeometry(QRect(0, 0, 30, 20));
ip_part2_->setGeometry(QRect(30, 0, 30, 20));
ip_part3_->setGeometry(QRect(60, 0, 30, 20));
ip_part4_->setGeometry(QRect(90, 0, 30, 20));
labeldot1_->setText(" .");
labeldot1_->setGeometry(QRect(27, 1, 6, 18));
labeldot1_->setAlignment(Qt::AlignCenter);
labeldot2_->setText(" .");
labeldot2_->setGeometry(QRect(57, 1, 6, 18));
labeldot2_->setAlignment(Qt::AlignCenter);
labeldot3_->setText(" .");
labeldot3_->setGeometry(QRect(87, 1, 6, 18));
labeldot3_->setAlignment(Qt::AlignCenter);
QWidget::setTabOrder(ip_part1_, ip_part2_);
QWidget::setTabOrder(ip_part2_, ip_part3_);
QWidget::setTabOrder(ip_part3_, ip_part4_);
//ccg设置后置索引顺序
ip_part1_->set_nexttab_edit(ip_part2_);
ip_part2_->set_nexttab_edit(ip_part3_);
ip_part3_->set_nexttab_edit(ip_part4_);
//ccg设置前置索引顺序
ip_part4_->set_beforetab_del(ip_part3_);
ip_part3_->set_beforetab_del(ip_part2_);
ip_part2_->set_beforetab_del(ip_part1_);
connect(ip_part1_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part2_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part3_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part4_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part1_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part2_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part3_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part4_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
}
MyIpAddrEdit::~MyIpAddrEdit()
{
}
void MyIpAddrEdit::textchangedslot(const QString& /*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
emit textchanged(ipaddr);
}
void MyIpAddrEdit::texteditedslot(const QString &/*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
emit textedited(ipaddr);
}
void MyIpAddrEdit::settext(const QString &text)
{
QString ippart1, ippart2, ippart3, ippart4;
QString qstring_validate = text;
// IP地址验证
QRegExp regexp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator regexp_validator(regexp, this);
int nPos = 0;
QValidator::State state = regexp_validator.validate(qstring_validate, nPos);
// IP合法
if (state == QValidator::Acceptable)
{
QStringList ippartlist = text.split(".");
int strcount = ippartlist.size();
int index = 0;
if (index < strcount)
{
ippart1 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart2 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart3 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart4 = ippartlist.at(index);
}
}
ip_part1_->setText(ippart1);
ip_part2_->setText(ippart2);
ip_part3_->setText(ippart3);
ip_part4_->setText(ippart4);
}
QString MyIpAddrEdit::text()
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
return QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
}
void MyIpAddrEdit::setStyleSheet(const QString &styleSheet)
{
ip_part1_->setStyleSheet(styleSheet);
ip_part2_->setStyleSheet(styleSheet);
ip_part3_->setStyleSheet(styleSheet);
ip_part4_->setStyleSheet(styleSheet);
}
下面是调用方法
#include <QApplication>
#include <QDialog>
#include "MyIpAddrEdit.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog *my_dialog = new QDialog;
MyIpAddrEdit *ipAddr = new MyIpAddrEdit(my_dialog);
ipAddr->settext("127.0.0.1");
my_dialog->show();
return app.exec();
}
PS:
如果是在QT designer中拖的控件LINEEDIT,则可以右键提升为MyIpAddrEdit类,在需要调用的界面#include "MyIpAddrEdit.h",既可以使用了。
1. 可以使用QLineEdit简单的实现
QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator *pValidator = new QRegExpValidator(regExp, this);
QLineEdit *lineEdit = new QLineEdit(this);
lineEdit->setValidator(new QRegExpValidator(pValidator, this));
lineEdit->setInputMask("000.000.000.000;");
但是上面的输入时没有window的IP地址控件好用。所以自己就用4个QLineEdit封装了一个,用起来好多了,
下面是代码:
// MyIpPartLineEdit.h
#pragma once
#include <QLineEdit>
class QWidget;
class QFocusEvent;
class QKeyEvent;
class MyIpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyIpPartLineEdit(QWidget *parent = 0);
~MyIpPartLineEdit(void);
void set_nexttab_edit(QLineEdit *nexttab) { next_tab_ = nexttab; }
void set_beforetab_del(QLineEdit *beforetab) { before_tab_ = beforetab;}
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void keyPressEvent(QKeyEvent *event);
private slots:
void text_edited(const QString& text);
private:
QLineEdit *next_tab_;
QLineEdit *before_tab_;
};
// MyIpPartLineEdit.cpp
#include "MyIpPartLineEdit.h"
#include <QIntValidator>
#include <QKeyEvent>
MyIpPartLineEdit::MyIpPartLineEdit(QWidget *parent/* = 0*/)
: QLineEdit(parent)
{
next_tab_ = NULL;
this->setMaxLength(3);
this->setFrame(false);
this->setAlignment(Qt::AlignCenter);
QValidator *validator = new QIntValidator(0, 255, this);
this->setValidator(validator);
connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(text_edited(const QString&)));
}
MyIpPartLineEdit::~MyIpPartLineEdit(void)
{
}
void MyIpPartLineEdit::focusInEvent(QFocusEvent *e)
{
this->selectAll();
QLineEdit::focusInEvent(e);
}
void MyIpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Period)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
//ccg 使删除完当前文本框以后跳到前一个文本框
if (event->key() == Qt::Key_Backspace)
{
while ((this->text().size() == 0)&&(this->objectName() != "ip_part1_"))
{
if (before_tab_)
{
before_tab_->setFocus();
return;
}
}
}
//CCG左键跳到前一个编辑框最右位置
if(event->key() == Qt::Key_Left)
{
if ((this->cursorPosition() ==0)&&(this->objectName() != "ip_part1_"))
{
if (before_tab_)
{
before_tab_->setFocus();
before_tab_->setCursorPosition(this->text().size());
return;
}
}
}
if(event->key() == Qt::Key_Right)
{
if ((this->cursorPosition() ==this->text().size())&&(this->objectName() != "ip_part4_"))
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->setCursorPosition(0);
return;
}
}
}
QLineEdit::keyPressEvent(event);
}
void MyIpPartLineEdit::text_edited(const QString& text)
{
QIntValidator v(0, 255, this);
QString ipaddr = text;
int pos = 0;
QValidator::State state = v.validate(ipaddr, pos);
if (state == QValidator::Acceptable)
{
if (ipaddr.size() > 1)
{
if (ipaddr.size() == 2)
{
int ipnum = ipaddr.toInt();
if (ipnum > 25)
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
else
{
if (next_tab_)
{
next_tab_->setFocus();
next_tab_->selectAll();
}
}
}
}
}
// MyIpAddrEdit.h
#pragma once
#include <QWidget>
class QLineEdit;
class QLabel;
class MyIpPartLineEdit;
class MyIpAddrEdit : public QWidget
{
Q_OBJECT
public:
MyIpAddrEdit(QWidget* pParent = 0);
~MyIpAddrEdit();
void settext(const QString &text);
QString text();
void setStyleSheet(const QString &styleSheet);
signals:
void textchanged(const QString& text);
void textedited(const QString &text);
private slots:
void textchangedslot(const QString& text);
void texteditedslot(const QString &text);
private:
MyIpPartLineEdit *ip_part1_;
MyIpPartLineEdit *ip_part2_;
MyIpPartLineEdit *ip_part3_;
MyIpPartLineEdit *ip_part4_;
QLabel *labeldot1_;
QLabel *labeldot2_;
QLabel *labeldot3_;
};
// MyIpAddrEdit.cpp
#include "MyIpAddrEdit.h"
#include <QRegExpValidator>
#include <QLabel>
#include "MyIpPartLineEdit.h"
MyIpAddrEdit::MyIpAddrEdit(QWidget* pParent /* = 0 */)
: QWidget(pParent)
{
ip_part1_ = new MyIpPartLineEdit(this);
ip_part2_ = new MyIpPartLineEdit(this);
ip_part3_ = new MyIpPartLineEdit(this);
ip_part4_ = new MyIpPartLineEdit(this);
labeldot1_ = new QLabel(this);
labeldot2_ = new QLabel(this);
labeldot3_ = new QLabel(this);
ip_part1_->setGeometry(QRect(0, 0, 30, 20));
ip_part2_->setGeometry(QRect(30, 0, 30, 20));
ip_part3_->setGeometry(QRect(60, 0, 30, 20));
ip_part4_->setGeometry(QRect(90, 0, 30, 20));
labeldot1_->setText(" .");
labeldot1_->setGeometry(QRect(27, 1, 6, 18));
labeldot1_->setAlignment(Qt::AlignCenter);
labeldot2_->setText(" .");
labeldot2_->setGeometry(QRect(57, 1, 6, 18));
labeldot2_->setAlignment(Qt::AlignCenter);
labeldot3_->setText(" .");
labeldot3_->setGeometry(QRect(87, 1, 6, 18));
labeldot3_->setAlignment(Qt::AlignCenter);
QWidget::setTabOrder(ip_part1_, ip_part2_);
QWidget::setTabOrder(ip_part2_, ip_part3_);
QWidget::setTabOrder(ip_part3_, ip_part4_);
//ccg设置后置索引顺序
ip_part1_->set_nexttab_edit(ip_part2_);
ip_part2_->set_nexttab_edit(ip_part3_);
ip_part3_->set_nexttab_edit(ip_part4_);
//ccg设置前置索引顺序
ip_part4_->set_beforetab_del(ip_part3_);
ip_part3_->set_beforetab_del(ip_part2_);
ip_part2_->set_beforetab_del(ip_part1_);
connect(ip_part1_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part2_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part3_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part4_, SIGNAL(textChanged(const QString&)), this, SLOT(textchangedslot(const QString&)));
connect(ip_part1_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part2_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part3_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
connect(ip_part4_, SIGNAL(textEdited (const QString&)), this, SLOT(texteditedslot(const QString&)));
}
MyIpAddrEdit::~MyIpAddrEdit()
{
}
void MyIpAddrEdit::textchangedslot(const QString& /*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
emit textchanged(ipaddr);
}
void MyIpAddrEdit::texteditedslot(const QString &/*text*/)
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
QString ipaddr = QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
emit textedited(ipaddr);
}
void MyIpAddrEdit::settext(const QString &text)
{
QString ippart1, ippart2, ippart3, ippart4;
QString qstring_validate = text;
// IP地址验证
QRegExp regexp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator regexp_validator(regexp, this);
int nPos = 0;
QValidator::State state = regexp_validator.validate(qstring_validate, nPos);
// IP合法
if (state == QValidator::Acceptable)
{
QStringList ippartlist = text.split(".");
int strcount = ippartlist.size();
int index = 0;
if (index < strcount)
{
ippart1 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart2 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart3 = ippartlist.at(index);
}
if (++index < strcount)
{
ippart4 = ippartlist.at(index);
}
}
ip_part1_->setText(ippart1);
ip_part2_->setText(ippart2);
ip_part3_->setText(ippart3);
ip_part4_->setText(ippart4);
}
QString MyIpAddrEdit::text()
{
QString ippart1, ippart2, ippart3, ippart4;
ippart1 = ip_part1_->text();
ippart2 = ip_part2_->text();
ippart3 = ip_part3_->text();
ippart4 = ip_part4_->text();
return QString("%1.%2.%3.%4")
.arg(ippart1)
.arg(ippart2)
.arg(ippart3)
.arg(ippart4);
}
void MyIpAddrEdit::setStyleSheet(const QString &styleSheet)
{
ip_part1_->setStyleSheet(styleSheet);
ip_part2_->setStyleSheet(styleSheet);
ip_part3_->setStyleSheet(styleSheet);
ip_part4_->setStyleSheet(styleSheet);
}
下面是调用方法
#include <QApplication>
#include <QDialog>
#include "MyIpAddrEdit.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog *my_dialog = new QDialog;
MyIpAddrEdit *ipAddr = new MyIpAddrEdit(my_dialog);
ipAddr->settext("127.0.0.1");
my_dialog->show();
return app.exec();
}
PS:
如果是在QT designer中拖的控件LINEEDIT,则可以右键提升为MyIpAddrEdit类,在需要调用的界面#include "MyIpAddrEdit.h",既可以使用了。
相关文章推荐
- Openstack Mitaka dashboard 增加自定义IP功能
- 重写struts2的TEXT标签对象以实现自己想在标签上增加默认显示内容的功能
- C# 编写自定义 IP 输入框控件
- Qt自定义带游标的slider,在滑块正上方显示当前值(类似于进度条,用一个额外的QLabel冒充QSilder的一部分,然后move就行了)
- XEditText:带删除功能的EditText;可设置自动添加分隔符分割电话号码、银行卡号等;支持禁止Emoji表情符号输入;自定义右边显示图标作功能选项;仿iOS输入框风格
- iOS table简单实现增加移动和删除功能与自定义cell的实现
- Angular 输入框实现自定义验证功能
- vivado设计三:一步一步生成自己的自定义IP核
- [置顶] Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
- HAproxy增加日志记录功能和自定义日志输出内容、格式
- SpringBoot自定义拦截器实现IP白名单功能
- Qt之开发环境配置——在VS2008中为QT增加代码提示功能
- Qt实现输入框,组合框提示,模糊查询,搜索关键字下拉提示功能
- 在保全tiny6410功能的前提下运行自己的Qt4程序(上)
- vs2008上QT中增加智能提示功能
- 自定义 iOS 密码框或验证码输入框,支持多位验证码,4位或6位验证码自己选择。
- 在.NET环境下为网站增加IP过滤功能
- 给自己的程序增加网页浏览功能(续)
- 在.NET环境下为网站增加IP过滤功能
- Android UI设计之<三>自定义EditText,实现带清除功能的输入框