【qt】获取主机信息系统

news2024/11/24 15:48:00

话不多说,先一睹芳颜!

在这里插入图片描述

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

目录

  • 一.登录界面设计
    • 1.ui登录设计
  • 二.加载界面
    • 1.lineEdit的密码输入模式
    • 2.lineEdit按回车跳转的信号
    • 3.密码的判断
    • 4.创建加载界面
    • 5.创建定时器来进行进度条的移动
    • 6.定时器执行的槽函数
  • 三.主机信息界面
    • 1.主机信息系统文字
    • 2.初始化按钮和布局
    • 3.对每个按钮进行手动关联
  • 四.实现相应槽函数功能
    • 1.主机名
    • 2.IPV4地址
    • 3.IPV6地址
    • 4.域名地址
    • 5.网卡地址
    • 6.网卡信息
  • 五.完整代码
  • 六.结语

一.登录界面设计

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();
        }
    }
}

六.结语

少即是多,慢即是快

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件系统架构的一些常见专业术语

分层架构是逻辑上的&#xff0c;在物理部署上&#xff0c;三层结构可以部署在同一个物理机器上&#xff0c;但是随着网站业务的发展&#xff0c;必然需要对已经分层的模块分离部署&#xff0c;即三层结构分别部署在不同的服务器上&#xff0c;使网站拥有更多的计算资源以应对越…

瑞芯微rk356x TF卡烧写选择指定的屏幕打印烧写的过程

rk356x中TF卡烧写屏幕选择 1、开发环境2、问题描述3、解决办法4、总结5、 图片展示1、开发环境 系统:linux系统 芯片:356x 显示:多屏显示(HDMI, MIPI, LVDS, EDP) 2、问题描述 由于在多屏显示的情况下,HDMI屏在LVDS、MIPI或者EDP协同下,默认情况下,在TF卡烧录过程中…

QT——Excel实现自绘区域选择边框

文章目录 一、自绘区域边框1.1、效果展示2.2、问题整理2.2.1、重绘单元格选择区2.2.2、选择区域的大小 一、自绘区域边框 1.1、效果展示 单选 多选 2.2、问题整理 2.2.1、重绘单元格选择区 误区: 继承QStyledItemDelegate重写paint,测试发现只能在单元格内绘制。 通过继…

秋招力扣刷题——从前序与中序遍历序列构造二叉树

一、题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 二、解法思路 根据二叉树的遍历结构重构二叉树&#xff0c;至少两种遍历方式结合&…

操作系统智能助手OS Copilot评测报告

背景 如果不是朋友告知&#xff0c;我还不知道阿里云推出了【操作系统智能助手OS Copilot】这样一款产品。 我做系统运维的工作还是挺多的&#xff0c;知道系统运维工作的一些痛点&#xff1b;例如&#xff1a; Linux命令繁杂&#xff0c;想全部记住不太可能&#xff0c;多数…

自注意力 公式解释

公式 (\mathbf{y}_i f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d) 描述了自注意力机制中单个词元的输出表示如何生成。我们来逐步解释这个公式&#xff1a; 输入序列 (\mathbf{x}_1, \mathbf{x}_2, \ldots, \math…

MySQL之备份与恢复(八)

备份与恢复 还原逻辑备份 如果还原的是逻辑备份而不是物理备份&#xff0c;则与使用操作系统简单地复制文件到适当位置的方式不同&#xff0c;需要使用MySQL服务器本身来加载数据到表中。在加载导出文件之前&#xff0c;应该先花一点时间考虑文件有多大&#xff0c;需要多久加…

数据结构--二叉树和堆

目录 1.基本概念 2.树的遍历方法 3.满二叉树&&完全二叉树 4.逻辑结构&&物理结构 5.推理公式 6.二叉树应用--堆 7.简单实现堆 1.基本概念 &#xff08;1&#xff09;这个里面的概念还是比较多的&#xff0c;但是大部分我们只需要了解即可&#xff0c;因为…

如何实现一套键盘鼠标控制两台计算机(Mouse Without Borders快速上手教程)

需求背景 当我们需要同时使用一台主机和一台笔记本的时候&#xff0c;如果使用两套键盘和鼠标分别操作各自的系统&#xff0c;非常地不便捷且非常占据桌面空间。那么如何使用一套键盘鼠标控制两台电脑呢&#xff1f; 需求实现 软件说明 我们可以使用微软官方的一款软件Mous…

vscode使用Git的常用操作

主打一个实用 查看此篇之前请先保证电脑安装了Git&#xff0c;安装教程很多&#xff0c;可自行搜索 一.初始化本地仓库&#x1f534; 使用vscode打开项目文件夹如图所使初始化仓库&#xff0c;相当于命令行的git init 二.提交到暂存区&#x1f534; 二.提交到新版本&#x1f…

07浅谈大语言模型可调节参数tempreture

浅谈temperature 什么是temperature&#xff1f; temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性&#xff1a; 控制确定性&#xff1a; temperature参数可以控制模型生成文本的确定性&#xff0c;大部分模型中temperatur…

RabbitMq - Java客户端基础【简单案例 +Work模型】

目录 1、前置知识 1.1、AMQP怎么理解 1.2、Spring AMQP是什么 1.3、为什么要了解Spring-AMQP&#xff1f; 2、使用Spring-AMQP实现一个发消息案例 3、Work模型 问题&#xff1a; 优化&#xff1a; 小结&#xff1a;Work模型的使用&#xff1a; 1、前置知识 1.1、AMQP怎…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备&#xff08;如传感器&#xff09;提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似&#xff0c;状…

妈妈带女儿美在心里

在这个充满温情与惊喜的午后&#xff0c;阳光温柔地洒落在每一个角落&#xff0c;仿佛连空气弥漫着幸福的味道。就在这样一个平凡的时刻&#xff0c;一段关于爱与成长的温馨画面&#xff0c;悄然在网络上绽放&#xff0c;引爆了无数人的心弦——#奚梦瑶2岁女儿身高#&#xff0c…

【Java】详解String类中的各种方法

创建字符串 常见的创建字符串的三种方式&#xff1a; // 方式一 String str "hello world"; // 方式二 String str2 new String("hello world"); // 方式三 char[] array {a, b, c}; String str3 new String(array); "hello" 这样的字符串字…

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库&#xff0c;以其卓越的读写速度而著称&#xff0c;广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

零基础STM32单片机编程入门(九)IIC总线详解及EEPROM实战含源码视频

文章目录 一.概要二.IIC总线基本概念1.总体特征2.通讯流程 三.EEPROM介绍1.M24C08基本介绍2.向M24C08写一个字节时序图3.从M24C08读一个字节时序图 四.GPIO模拟IIC驱动M24C08读写五.CubeMX工程源代码下载六.讲解视频链接地址七.小结 一.概要 IIC(Inter&#xff0d;Integrated …

认识异常详解

1. 异常的定义&#xff1a; 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型&#xff1a;受检异常&#xff08;Checked Exception&#xff09;和未受检异常&#xff08;Unchecked Exception&…

C9联盟是什么?

九校联盟&#xff08;C9 League&#xff09;&#xff0c;简称C9联盟&#xff0c;是中国首个顶尖大学间的高校联盟&#xff0c;于2009年10月正式启动。 其成员都是国家首批“985工程”重点建设的一流大学&#xff0c;包括北京大学、清华大学、哈尔滨工业大学、复旦大学、上海交通…

水仙花数算法

一、水仙花的传说 希腊神话故事 传说希腊神话里&#xff0c;美少年纳西索斯&#xff08;Narcissus&#xff09;是希腊最俊美的男子&#xff0c;无数的少女对他一见倾心&#xff0c;可他却自负地拒绝了所有的人。这当中包括美丽的山中仙女伊可&#xff08;Echo&#xff09;。伊可…