【qt】获取主机信息系统

本文涉及的产品
.cn 域名,1个 12个月
简介: 【qt】获取主机信息系统

话不多说,先一睹芳颜!

如果你也想达到这种效果,那咱们就开始吧!

一.登录界面设计

1.ui登录设计

可对Label标签进行居中显示.

也可以添加样式表,show出你的美.

label标签添加自定义大小的图片

二.加载界面

1.lineEdit的密码输入模式

输入的就是黑点,看不到真正的密码.

2.lineEdit按回车跳转的信号

3.密码的判断

如果密码错了,就继续输入,有三次机会,如果对了,就删除当前的界面.

4.创建加载界面

5.创建定时器来进行进度条的移动

当间隔时间一到,就会发出timeout信号,对槽函数**moveProgressBar()**进行执行!

6.定时器执行的槽函数

如果进度条的值加载到了一百,我们就跳转到主机信息的界面!

注意一定要将前面的布局删除,后面才能加新的布局.

因为我们在同一个窗口进行,所有后面的界面都是用代码来实现的.

要想显示就必须要加布局.

三.主机信息界面

1.主机信息系统文字

设置了渐变色,字体,居中,最小高度.

2.初始化按钮和布局

3.对每个按钮进行手动关联

四.实现相应槽函数功能

1.主机名

2.IPV4地址

3.IPV6地址

4.域名地址

5.网卡地址

6.网卡信息

五.完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProgressBar>
#include <QLabel>
#include <QTimer>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QHostInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_lineEditPwd_returnPressed();
    void onButtonHostName();
    void onButtonHostIPV4();
    void onButtonHostIPV6();
    void onButtonNameIP();
    void onButtonNetworkInterfaceIP();
    void onButtonNetworkInterfaceInfo();
    void nameIP(const QHostInfo &host);
    void moveProgressBar();
private:
    Ui::Widget *ui;
    QProgressBar*progressBar;
    QLabel*loginLabel;
    QTimer*timer;
    QVBoxLayout *layout;
    QPushButton* buttonHostName;
    QPushButton* buttonHostIPV4;
    QPushButton* buttonHostIPV6;
    QPushButton* buttonNameIP;//域名
    QPushButton* buttonNetworkInterfaceIP;//网卡
    QPushButton* buttonNetworkInterfaceInfo;
    QLabel*lableName;
    QLineEdit*lineEdit;
    void initBackground();
    void initProgressBar();
    void initTimer();
    void initMenu();
    void initSignalSlots();
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QStackedWidget>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QLayout>
#include <QDebug>
#include <QHostInfo>
#include <QNetworkInterface>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEditPwd->setEchoMode(QLineEdit::Password);
    initBackground();
    initTimer();
}
Widget::~Widget()
{
    delete ui;
}
void Widget::initBackground()
{
    this->setFixedWidth(566);
    this->setFixedHeight(366);
    QPixmap pixmap(":/images/tx.png");
    pixmap = pixmap.scaled(ui->labelImage->width(),ui->labelImage->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); // 保持宽高比
    ui->labelImage->setPixmap(pixmap);
}
void Widget::initProgressBar()
{
    progressBar=new QProgressBar;
    progressBar->setValue(0);
    progressBar->setRange(0,100);
    loginLabel=new QLabel("正在登录中...");
    loginLabel->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    QFont font;
    font.setBold(true);
    font.setFamily("微软雅黑");
    font.setPointSize(30);
    loginLabel->setFont(font);
    layout = new QVBoxLayout;
    layout->addWidget(loginLabel);
    layout->addWidget(progressBar);
    // 将布局设置为窗口的布局
    setLayout(layout);
}
void Widget::initTimer()
{
    timer=new QTimer;
    timer->setTimerType(Qt::CoarseTimer);
    timer->setInterval(50);
    connect(timer,SIGNAL(timeout()),this,SLOT(moveProgressBar()));
}
void Widget::initMenu()
{
    
    lableName=new QLabel("主机信息系统");
    lableName->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    QFont font;
    font.setBold(true);
    font.setFamily("微软雅黑");
    font.setPointSize(30);
    lableName->setFont(font);
    lableName->setMinimumHeight(100);
    QLinearGradient gradient(0, 0, lableName->width(), lableName->height()); // 创建线性渐变,从左上角到右下角
    gradient.setColorAt(0, Qt::blue); // 设置渐变起始颜色
    gradient.setColorAt(1, Qt::green); // 设置渐变结束颜色
    QPalette palette;
    palette.setBrush(QPalette::WindowText, QBrush(gradient)); // 将渐变设置为标签文字的画刷
    lableName->setPalette(palette); // 设置标签的调色板
    buttonHostName=new QPushButton("查看主机名");
    buttonHostIPV4=new QPushButton("查看IPV4地址");
    buttonHostIPV6=new QPushButton("查看IPV6地址");
    lineEdit=new QLineEdit;
    lineEdit->setPlaceholderText("请输入域名");
    buttonNameIP=new QPushButton("查看域名IP地址");
    buttonNetworkInterfaceIP=new QPushButton("查看网卡IP");
    buttonNetworkInterfaceInfo =new QPushButton("查看网卡信息");
    QVBoxLayout *Vlayout=new QVBoxLayout;
    Vlayout->addWidget(buttonHostName);
    Vlayout->addWidget(buttonHostIPV4);
    Vlayout->addWidget(buttonHostIPV6);
    QVBoxLayout *Vlayout2=new QVBoxLayout;
    Vlayout2->addWidget(lineEdit);
    Vlayout2->addWidget(buttonNameIP);
    Vlayout2->addWidget(buttonNetworkInterfaceIP);
    Vlayout2->addWidget(buttonNetworkInterfaceInfo);
    QHBoxLayout *Hlayout=new QHBoxLayout;
    Hlayout->addLayout(Vlayout);
    Hlayout->addStretch();
    Hlayout->addLayout(Vlayout2);
    QVBoxLayout *Vlayout3=new QVBoxLayout;
    Vlayout3->addWidget(lableName);
    Vlayout3->addLayout(Hlayout);
    setLayout(Vlayout3);
    initSignalSlots();
}
void Widget::initSignalSlots()
{
    connect(buttonHostName,SIGNAL(clicked()),this,SLOT(onButtonHostName()));
    connect(buttonHostIPV4,SIGNAL(clicked()),this,SLOT(onButtonHostIPV4()));
    connect(buttonHostIPV6,SIGNAL(clicked()),this,SLOT(onButtonHostIPV6()));
    connect(buttonNameIP,SIGNAL(clicked()),this,SLOT(onButtonNameIP()));
    connect(buttonNetworkInterfaceIP,SIGNAL(clicked()),this,SLOT(onButtonNetworkInterfaceIP()));
    connect(buttonNetworkInterfaceInfo,SIGNAL(clicked()),this,SLOT(onButtonNetworkInterfaceInfo()));
}
void Widget::on_lineEditPwd_returnPressed()
{
    static int count=0;
    if(ui->lineEditPwd->text().trimmed()=="123456")
    {
        initProgressBar();
        timer->start();
        delete ui->groupBox;
    }
    else
    {
        if(++count>3)
        {
            QMessageBox::warning(this,"警告","密码输入错误过多,直接退出程序!");
            this->close();
        }
        else
        {
            QMessageBox::information(this,"消息","密码输入错误,请重新输入!");
        }
    }
}
void Widget::onButtonHostName()
{
    QString hostName=QHostInfo::localHostName();
    QMessageBox::information(this,"主机信息","您的主机名为:"+hostName);
}
void Widget::onButtonHostIPV4()
{
    QHostInfo info=QHostInfo::fromName(QHostInfo::localHostName());
    QList<QHostAddress> list=info.addresses();//返回的不是指针
    if(!list.isEmpty())
    {
        QString str;
        for(int i=0;i<list.count();i++)
        {
            QHostAddress address=list[i];
            if(address.protocol()==QAbstractSocket::IPv4Protocol)
            {
                str+=address.toString()+"\n";
            }
        }
        QMessageBox::information(this,"主机信息","IPV4:\n"+str);
    }
}
void Widget::onButtonHostIPV6()
{
    QHostInfo info=QHostInfo::fromName(QHostInfo::localHostName());
    QList<QHostAddress> list=info.addresses();//返回的不是指针
    if(!list.isEmpty())
    {
        QString str;
        for(int i=0;i<list.count();i++)
        {
            QHostAddress address=list[i];
            if(address.protocol()==QAbstractSocket::IPv6Protocol)
            {
                str+=address.toString()+"\n";
            }
        }
        QMessageBox::information(this,"主机信息","IPV6:\n"+str);
    }
}
void Widget::onButtonNameIP()
{
    QString name=lineEdit->text().trimmed();
    if(name=="") return;
    QHostInfo::lookupHost(name,this,SLOT(nameIP(QHostInfo)));
}
void Widget::onButtonNetworkInterfaceIP()
{
   QList<QHostAddress> list=QNetworkInterface::allAddresses();
   if(!list.isEmpty())
   {
       QString str;
       for(int i=0;i<list.count();i++)
       {
           QHostAddress address=list[i];
           if(address.protocol()==QAbstractSocket::IPv4Protocol)
           {
               str+=address.toString()+"\n";
           }
       }
       QMessageBox::information(this,"网卡信息","网卡的IPV4:\n"+str);
   }
}
void Widget::onButtonNetworkInterfaceInfo()
{
    QList<QNetworkInterface> listInterface=QNetworkInterface::allInterfaces();
    if(!listInterface.isEmpty())
    {
        QString str;
        for(int i=0;i<listInterface.count();i++)
        {
            QNetworkInterface interface=listInterface[i];
            str+="设备名称:"+interface.humanReadableName()+"\n";
            str+="硬件地址:"+interface.hardwareAddress()+"\n";
            QList<QNetworkAddressEntry> list=interface.addressEntries();
            if(!list.isEmpty())
            {
                for(int i=0;i<list.count();i++)
                {
                    QNetworkAddressEntry address=list[i];
                    str+="子网掩码:"+address.netmask().toString()+"\n";
                    str+="广播地址:"+address.broadcast().toString()+"\n";
                    str+="IP地址:"+address.ip().toString()+"\n\n";
                }
            }
        }
        QMessageBox::information(this,"网卡信息",str);
    }
}
void Widget::nameIP(const QHostInfo &host)
{
    QList<QHostAddress> list=host.addresses();//返回的不是指针
    if(!list.isEmpty())
    {
        QString str;
        for(int i=0;i<list.count();i++)
        {
            QHostAddress address=list[i];
            if(address.protocol()==QAbstractSocket::IPv6Protocol)
            {
                str+=address.toString()+"\n";
            }
        }
        QString name=lineEdit->text().trimmed();
        QMessageBox::information(this,"域名信息",name+"的IPV6:\n"+str);
    }
}
void Widget::moveProgressBar()
{
    static int value=0;
    progressBar->setValue(++value);
    if(value==100)
    {
        timer->stop();
        QMessageBox::StandardButton ret=
                QMessageBox::information(this,"提示","登录成功!",QMessageBox::Ok,QMessageBox::NoButton);
        if(ret==QMessageBox::Ok)
        {
            progressBar->hide();
            loginLabel->hide();
            delete layout;
            initMenu();
        }
    }
}

六.结语

少即是多,慢即是快

相关文章
|
4月前
【qt】如何读取文件并拆分信息?
【qt】如何读取文件并拆分信息?
45 0
|
4月前
|
网络协议
【qt】TCP客户端信息的接受和发送
【qt】TCP客户端信息的接受和发送
34 0
|
4月前
|
网络协议
【qt】TCP 服务端怎么收到信息?
【qt】TCP 服务端怎么收到信息?
59 0
|
2月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
107 3
(13) Qt事件系统(two)
|
2月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
94 0
(12)Qt事件系统(one)
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
106 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
API
Qt绘图之Paint系统
Qt绘图之Paint系统
68 2
|
4月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
237 4
|
4月前
从源码角度分析Qt元对象系统2
从源码角度分析Qt元对象系统
61 0
|
4月前
|
存储
从源码角度分析Qt元对象系统1
从源码角度分析Qt元对象系统
88 0