QT IP输入框
时间: 2025-07-01 13:58:02 浏览: 16
在 Qt 框架中实现一个用于输入 IP 地址的输入框组件,通常可以通过继承 `QLineEdit` 或使用多个 `QLineEdit` 控件来分别表示 IP 地址的四个字段(如 192.168.0.1),并结合验证逻辑确保用户输入的是合法的 IP 地址格式。
### 基本实现思路
1. **自定义控件结构**
可以创建一个继承自 `QWidget` 的类,并在其布局中放置四个 `QLineEdit` 控件,每个对应 IP 地址的一个段。此外,添加逻辑处理光标自动切换、退格键行为以及输入过滤等功能。
2. **设置初始值与获取当前值**
提供方法用于设置默认 IP 地址或获取当前用户输入的完整 IP 地址字符串:
```cpp
void setIP(const QString &ip);
QString getIP() const;
```
3. **验证输入合法性**
对每个输入框的内容进行验证,确保其为 0 到 255 之间的数字,并且整体格式符合 IPv4 地址规范。
```cpp
bool isValid() const;
```
验证失败时可以发出警告或清除无效输入 [^2]。
4. **美化与交互增强**
支持设置背景色、边框颜色和圆角等外观属性,提升用户体验:
```cpp
void setBgColor(const QString &bgColor);
void setBorderColor(const QString &borderColor);
void setBorderRadius(int borderRadius);
```
此外,支持按下小数点自动跳转到下一个输入框,退格清空当前框并跳回前一个框等操作 [^4]。
### 示例代码
以下是一个简化的示例实现:
#### 自定义控件头文件:`ipaddresswidget.h`
```cpp
#ifndef IPADDRESSWIDGET_H
#define IPADDRESSWIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QHBoxLayout>
class IPAddressWidget : public QWidget {
Q_OBJECT
public:
explicit IPAddressWidget(QWidget *parent = nullptr);
QString getIP() const;
void setIP(const QString &ip);
bool isValid() const;
private:
QLineEdit *octet1, *octet2, *octet3, *octet4;
QHBoxLayout *layout;
void setupConnections();
};
#endif // IPADDRESSWIDGET_H
```
#### 实现文件:`ipaddresswidget.cpp`
```cpp
#include "ipaddresswidget.h"
#include <QRegExpValidator>
#include <QDebug>
IPAddressWidget::IPAddressWidget(QWidget *parent) : QWidget(parent), layout(new QHBoxLayout(this)) {
octet1 = new QLineEdit(this);
octet2 = new QLineEdit(this);
octet3 = new QLineEdit(this);
octet4 = new QLineEdit(this);
QRegExp ipRegex("^([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$");
QValidator *validator = new QRegExpValidator(ipRegex, this);
for (QLineEdit *edit : {octet1, octet2, octet3, octet4}) {
edit->setMaxLength(3);
edit->setValidator(validator);
edit->setFixedSize(40, 25);
layout->addWidget(edit);
}
setupConnections();
}
void IPAddressWidget::setupConnections() {
connect(octet1, &QLineEdit::textChanged, [=](const QString &text){
if (text.length() == 3) octet2->setFocus();
});
connect(octet2, &QLineEdit::textChanged, [=](const QString &text){
if (text.length() == 3) octet3->setFocus();
});
connect(octet3, &QLineEdit::textChanged, [=](const QString &text){
if (text.length() == 3) octet4->setFocus();
});
}
QString IPAddressWidget::getIP() const {
return QString("%1.%2.%3.%4")
.arg(octet1->text().isEmpty() ? "0" : octet1->text())
.arg(octet2->text().isEmpty() ? "0" : octet2->text())
.arg(octet3->text().isEmpty() ? "0" : octet3->text())
.arg(octet4->text().isEmpty() ? "0" : octet4->text());
}
void IPAddressWidget::setIP(const QString &ip) {
QStringList parts = ip.split(".");
if (parts.size() == 4) {
octet1->setText(parts[0]);
octet2->setText(parts[1]);
octet3->setText(parts[2]);
octet4->setText(parts[3]);
}
}
bool IPAddressWidget::isValid() const {
for (QLineEdit *edit : {octet1, octet2, octet3, octet4}) {
bool ok;
int val = edit->text().toInt(&ok);
if (!ok || val < 0 || val > 255)
return false;
}
return true;
}
```
#### 使用示例:主窗口调用该控件
```cpp
#include <QApplication>
#include <QVBoxLayout>
#include <QPushButton>
#include "ipaddresswidget.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *mainLayout = new QVBoxLayout(&window);
IPAddressWidget *ipInput = new IPAddressWidget(&window);
QPushButton *btnGetIP = new QPushButton("Get IP", &window);
QPushButton *btnSetIP = new QPushButton("Set Default IP", &window);
ipInput->setIP("192.168.1.1");
QObject::connect(btnGetIP, &QPushButton::clicked, [=](){
qDebug() << "Current IP:" << ipInput->getIP();
qDebug() << "Is Valid:" << ipInput->isValid();
});
QObject::connect(btnSetIP, &QPushButton::clicked, [=](){
ipInput->setIP("10.0.0.1");
});
mainLayout->addWidget(ipInput);
mainLayout->addWidget(btnGetIP);
mainLayout->addWidget(btnSetIP);
window.show();
return app.exec();
}
```
---
###
阅读全文
相关推荐


















