话不多说,先一睹芳颜!
如果你也想达到这种效果,那咱们就开始吧!
一.登录界面设计
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(); } } }
六.结语
少即是多,慢即是快