#ifndef IPPARTLINEEDIT_H
#define IPPARTLINEEDIT_H
#include <QLineEdit>
class QWidget;
class QFocusEvent;
class QKeyEvent;
class IpPartLineEdit : public QLineEdit
{
Q_OBJECT
public:
IpPartLineEdit(QWidget *parent = 0);
~IpPartLineEdit(void);
void set_prevtab_edit(IpPartLineEdit *prevtab) { prev_tab = prevtab; }
void set_nexttab_edit(IpPartLineEdit *nexttab) { next_tab = nexttab; }
private:
IpPartLineEdit *prev_tab;
IpPartLineEdit *next_tab;
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void keyPressEvent(QKeyEvent *event);
private slots:
void text_edited(const QString& text);
};
#endif // IPPARTLINEEDIT_H
#include "ippartlineedit.h"
#include <QIntValidator>
#include <QKeyEvent>
#include <QWidget>
#include <QFocusEvent>
#include <QKeyEvent>
#include <QDebug>
IpPartLineEdit::IpPartLineEdit(QWidget *parent/* = 0*/)
: QLineEdit(parent)
{
//下一个
prev_tab = NULL;
//上一个
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&)));
}
//析构函数
IpPartLineEdit::~IpPartLineEdit(void)
{
}
//焦点函数
void IpPartLineEdit::focusInEvent(QFocusEvent *e)
{
this->selectAll();
QLineEdit::focusInEvent(e);
}
//按键处理函数
void IpPartLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Period)
{
QString current_tab = this->text();
if (next_tab&& (!current_tab.isEmpty()))
{
next_tab->setFocus();
next_tab->selectAll();
}
}
else if (event->key() == Qt::Key_Backspace)
{
QString current_tab = this->text();
if (prev_tab&& (current_tab.isEmpty()))
{
prev_tab->setFocus();
prev_tab->selectAll();
}
}
else if (event->key() == Qt::Key_Left)
{
int index = cursorPosition();
QString current_tab = this->text();
if(index==0)
{
if (prev_tab&& (!current_tab.isEmpty()))
{
prev_tab->setFocus();
prev_tab->selectAll();
}
}
}
else if (event->key() == Qt::Key_Right)
{
QString current_tab = this->text();
if (cursorPosition() == current_tab.length())
{
if (next_tab&& (!current_tab.isEmpty()))
{
next_tab->setFocus();
next_tab->selectAll();
}
}
}
QLineEdit::keyPressEvent(event);
}
//输入编译函数
void IpPartLineEdit::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();
}
}
}
}
}
#ifndef IPADDRLINEEDIT_H
#define IPADDRLINEEDIT_H
#include <QWidget>
class IpPartLineEdit;
class QLabel;
class QLineEdit;
class IpAddrLineEdit : public QWidget
{
Q_OBJECT
public:
explicit IpAddrLineEdit(QWidget *parent = nullptr);
~IpAddrLineEdit();
void setMaxMinHeight(int height);
bool isIPaddress(QString ip);
void settext(const QString &text);
QString text();
void getIp(QString& ip1, QString& ip2, QString& ip3, QString& ip4);
void resizeEvent(QResizeEvent *event);
private:
IpPartLineEdit *ip_part1;
IpPartLineEdit *ip_part2;
IpPartLineEdit *ip_part3;
IpPartLineEdit *ip_part4;
QLabel *labeldot1;
QLabel *labeldot2;
QLabel *labeldot3;
signals:
void textchanged(const QString& text);
void textedited(const QString &text);
private slots:
void textchangedslot(const QString& text);
void texteditedslot(const QString &text);
};
#endif // IPADDRLINEEDIT_H
#include "ipaddrlineedit.h"
#include "ippartlineedit.h"
#include <QRegExpValidator>
#include <QLabel>
#include <QHBoxLayout>
#include <QMessageBox>
#include <QStringList>
#include <QLineEdit>
IpAddrLineEdit::IpAddrLineEdit(QWidget *parent) : QWidget(parent)
{
QFont font(".萍方-简", 10);
ip_part1 = new IpPartLineEdit(this);
ip_part2 = new IpPartLineEdit(this);
ip_part3 = new IpPartLineEdit(this);
ip_part4 = new IpPartLineEdit(this);
labeldot1 = new QLabel();
labeldot2 = new QLabel();
labeldot3 = new QLabel();
ip_part1->setFont(font);
ip_part2->setFont(font);
ip_part3->setFont(font);
ip_part4->setFont(font);
labeldot1->setText(".");
labeldot1->setFont(font);
labeldot1->setAlignment(Qt::AlignCenter);
labeldot1->setStyleSheet("background-color: rgb(255, 255, 255)");
labeldot2->setText(".");
labeldot2->setFont(font);
labeldot2->setAlignment(Qt::AlignCenter);
labeldot2->setStyleSheet("background-color: rgb(255, 255, 255)");
labeldot3->setText(".");
labeldot3->setFont(font);
labeldot3->setAlignment(Qt::AlignCenter);
labeldot3->setStyleSheet("background-color: rgb(255, 255, 255)");
QWidget::setTabOrder(ip_part1, ip_part2);//定义切换焦点顺序
QWidget::setTabOrder(ip_part2, ip_part3);
QWidget::setTabOrder(ip_part3, ip_part4);
ip_part1->set_nexttab_edit(ip_part2);
ip_part2->set_nexttab_edit(ip_part3);
ip_part3->set_nexttab_edit(ip_part4);
ip_part2->set_prevtab_edit(ip_part1);
ip_part3->set_prevtab_edit(ip_part2);
ip_part4->set_prevtab_edit(ip_part3);
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&)));
}
//设置对话框高度
void IpAddrLineEdit::setMaxMinHeight(int height)
{
ip_part1->setMaximumHeight(height);ip_part1->setMinimumHeight(height);
ip_part2->setMaximumHeight(height);ip_part2->setMinimumHeight(height);
ip_part3->setMaximumHeight(height);ip_part3->setMinimumHeight(height);
ip_part4->setMaximumHeight(height);ip_part4->setMinimumHeight(height);
labeldot1->setMaximumHeight(height);labeldot1->setMinimumHeight(height);
labeldot2->setMaximumHeight(height);labeldot2->setMinimumHeight(height);
labeldot3->setMaximumHeight(height);labeldot3->setMinimumHeight(height);
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setMargin(0);
layout->setSpacing(0);
layout->addWidget(ip_part1);
layout->addWidget(labeldot1);
layout->addWidget(ip_part2);
layout->addWidget(labeldot2);
layout->addWidget(ip_part3);
layout->addWidget(labeldot3);
layout->addWidget(ip_part4);
layout->setStretch(0,10);
layout->setStretch(1,1);
layout->setStretch(2,10);
layout->setStretch(3,1);
layout->setStretch(4,10);
layout->setStretch(5,1);
layout->setStretch(6,10);
}
//更改IP对话框大小
void IpAddrLineEdit::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
setMaxMinHeight(height());
}
//析构函数
IpAddrLineEdit::~IpAddrLineEdit()
{
}
//内容改变
void IpAddrLineEdit::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 IpAddrLineEdit::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);
}
//判断IP是否可用
bool IpAddrLineEdit::isIPaddress(QString text)
{
QString qstring_validate = text;
QStringList ippart = qstring_validate.split(".");
if(ippart.size()!=4)
{
QMessageBox::information(this, "友情提示", "设置的ip地址\n格式错误");
return false;
}
int data=0;
QString str;
for(int i=0;i<4;i++)
{
str=ippart.at(i);
data=str.toInt();
if(data<0||data>255)
{
QMessageBox::information(this, "友情提示", "设置的ip地址\n格式错误");
return false;
}
}
return true;
}
//设置IP
void IpAddrLineEdit::settext(const QString &text)
{
if(isIPaddress(text))
{
QString qstring_validate = text;
QStringList ippart = qstring_validate.split(".");
ip_part1->setText(ippart.at(0));
ip_part2->setText(ippart.at(1));
ip_part3->setText(ippart.at(2));
ip_part4->setText(ippart.at(3));
}
}
//得到控件IP
QString IpAddrLineEdit::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);
}
//得到IP对应的数字
void IpAddrLineEdit::getIp(QString& ip1, QString& ip2, QString& ip3, QString& ip4)
{
ip1 = ip_part1->text();
ip2 = ip_part2->text();
ip3 = ip_part3->text();
ip4 = ip_part4->text();
}
提升
应用
ui->widget->settext("192.168.0.234");
效果
参考博文:https://www.cnblogs.com/simpleCY/articles/11848584.html