在上位机系统中,经常需要显示当前软件版本,当前fpga版本,那么咱就做一个help的菜单的关于界面
解决的问题:
解决显示版本信息的UI
Axure界面图:
如何实现:
实现文件的存储:QSetting来存储版本信息文件,详细看代码
UI的实现图:
代码块解析:
.h文件
/*********************************************************************************
*Author:zhouFuLiang
*Date: 2024-04-20 16:46
*Description: 显示关于信息
**********************************************************************************/
#ifndef DEABOUTUI_H
#define DEABOUTUI_H#include <QDialog>
#include <QLabel>// 数据结构,用于存储版本信息
struct VersionInfo {QString appVersion;QString installDate;QString content;QString fpgaVersion;QString fpgaInstDate;QString fpgaContent;
};class DeAboutUi : public QDialog
{Q_OBJECT
public:explicit DeAboutUi(QWidget *parent = 0);void writeFpgaVesion(int iValue);void writeFpgaInstallDate(int iValue);signals:public slots:private:void initConnect();void initGeometry();/** @brief 将整数转换为日期时间,* @param intValue 如2022* @param* @return 返回对应的QString*/QString intToDateString(int intValue);void writeDefaultVersionInfo();VersionInfo readVersionInfo();/** @brief 更新版本信息的UI* @param* @param* @return*/void notifyVersionUi();
private:QLabel *m_pSoftVer;QLabel *m_pSoftData;QLabel *m_pSoftContent;QLabel *m_pFpgaVer;QLabel *m_pFpgaData;QLabel *m_pFpgaContent;QFrame *pVLine1;QFrame *pVLine2;QString m_sysVesPath;
};#endif // DEABOUTUI_H
.cpp文件
#include "deabout_ui.h"
#include <QVBoxLayout>
#include <QGridLayout>
#include "public.h"DeAboutUi::DeAboutUi(QWidget *parent) : QDialog(parent)
{this->resize(350,250);this->setWindowTitle(QString::fromLocal8Bit("关于"));m_pSoftVer = new QLabel(this);m_pSoftData= new QLabel(this);m_pSoftContent= new QLabel(this);m_pFpgaVer= new QLabel(this);m_pFpgaData= new QLabel(this);m_pFpgaContent= new QLabel(this);pVLine1 = new QFrame(this);pVLine1->setFrameStyle(QFrame::HLine | QFrame::Plain);pVLine1->setLineWidth(2);pVLine1->setStyleSheet("color: black");pVLine2 = new QFrame(this);pVLine2->setFrameStyle(QFrame::HLine | QFrame::Plain);pVLine2->setLineWidth(2);pVLine2->setStyleSheet("color: black");initGeometry();initConnect();m_sysVesPath = qApp->applicationDirPath()+ "/" + "AppDoc/SystemIni/" + "version.ini";// 检查配置文件是否存在QFileInfo configFile(m_sysVesPath);if (!configFile.exists()) {// 如果配置文件不存在,则写入默认版本信息writeDefaultVersionInfo();}// 读取版本信息notifyVersionUi();writeFpgaInstallDate(20210212);}void DeAboutUi::writeFpgaVesion(int iValue)
{QString fpgaVersion= QString::number(iValue);// 创建QSettings对象并指定INI文件路径QSettings settings(m_sysVesPath, QSettings::IniFormat);// 写入版本信息到INI文件settings.beginGroup("FPGAVersion");settings.setValue("FpgaVersion", fpgaVersion);settings.endGroup();notifyVersionUi();
}void DeAboutUi::writeFpgaInstallDate(int iValue)
{QString fpgaDate= intToDateString(iValue);// 创建QSettings对象并指定INI文件路径QSettings settings(m_sysVesPath, QSettings::IniFormat);// 写入版本信息到INI文件settings.beginGroup("FPGAVersion");settings.setValue("FpgaDate", fpgaDate);settings.endGroup();notifyVersionUi();
}void DeAboutUi::initConnect()
{}void DeAboutUi::initGeometry()
{QFont font;font.setBold(true);font.setFamily("Microsoft JhengHei");QVBoxLayout *layout = new QVBoxLayout;QLabel *sLabey = new QLabel(QString::fromLocal8Bit("软件版本:"), this);sLabey->setFont(font);layout->addWidget(sLabey, Qt::AlignLeft | Qt::AlignBottom);QGridLayout *glayout1 = new QGridLayout;glayout1->addWidget(new QLabel(QString::fromLocal8Bit("版本号:"), this),0, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout1->addWidget(m_pSoftVer,0, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout1->addWidget(new QLabel(QString::fromLocal8Bit("日期:"), this),1, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout1->addWidget(m_pSoftData,1, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout1->addWidget(new QLabel(QString::fromLocal8Bit("内容:"), this),2, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout1->addWidget(m_pSoftContent,2, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);QGridLayout *glayout2 = new QGridLayout;glayout2->addWidget(new QLabel(QString::fromLocal8Bit("版本号:"), this),0, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout2->addWidget(m_pFpgaVer,0, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout2->addWidget(new QLabel(QString::fromLocal8Bit("日期:"), this),1, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout2->addWidget(m_pFpgaData,1, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout2->addWidget(new QLabel(QString::fromLocal8Bit("内容:"), this),2, 0, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);glayout2->addWidget(m_pFpgaContent,2, 1, 1, 1,Qt::AlignLeft | Qt::AlignHCenter);layout->addWidget(pVLine1, 2, Qt::AlignTop);layout->addLayout(glayout1);QLabel *fLabey = new QLabel(QString::fromLocal8Bit("FPGA版本:"), this);fLabey->setFont(font);layout->addWidget(fLabey, Qt::AlignLeft | Qt::AlignBottom);layout->addWidget(pVLine2, 0, Qt::AlignTop);layout->addLayout(glayout2);this->setLayout(layout);
}QString DeAboutUi::intToDateString(int intValue)
{// 解析年、月、日int year = intValue / 10000; // 获取年份int month = (intValue / 100) % 100; // 获取月份int day = intValue % 100; // 获取日// 构建QDateTime对象QDateTime dateTime(QDate(year, month, day));// 将QDateTime对象格式化为字符串return dateTime.toString("yyyy-MM-dd"); // 根据需要选择日期格式
}void DeAboutUi::writeDefaultVersionInfo()
{// 创建QSettings对象并指定INI文件路径QSettings settings(m_sysVesPath, QSettings::IniFormat);// 写入默认版本信息到INI文件settings.beginGroup("APPVersion");settings.setValue("AppVersion", QString("%1").arg(FORMAL_VERSION_NUMBER));settings.setValue("AppDate", "2024-04-20");settings.setValue("AppContent", "strContent");settings.endGroup();settings.beginGroup("FPGAVersion");settings.setValue("FpgaVersion", QString("%1").arg(FORMAL_VERSION_NUMBER));settings.setValue("FpgaDate", "2024-04-20");settings.setValue("FpgaContent", "strContent");settings.endGroup();qDebug() << "Default version information has been written to config.ini";
}VersionInfo DeAboutUi::readVersionInfo()
{// 创建QSettings对象并指定INI文件路径QSettings settings(m_sysVesPath, QSettings::IniFormat);// 读取版本信息VersionInfo info;settings.beginGroup("APPVersion");info.appVersion = settings.value("AppVersion").toString();info.installDate = settings.value("AppDate").toString();info.content = settings.value("AppContent").toString();settings.endGroup();settings.beginGroup("FPGAVersion");info.fpgaVersion = settings.value("FpgaVersion").toString();info.fpgaInstDate = settings.value("FpgaDate").toString();info.fpgaContent = settings.value("FpgaContent").toString();settings.endGroup();return info;
}void DeAboutUi::notifyVersionUi()
{VersionInfo vers = readVersionInfo();m_pSoftVer->setText(QString("V%1").arg(vers.appVersion));m_pSoftData->setText(QString("%1").arg(vers.installDate));m_pSoftContent->setText(QString("%1").arg(vers.content));m_pFpgaVer->setText(QString("%1").arg(vers.fpgaVersion));m_pFpgaData->setText(QString("%1").arg(vers.fpgaInstDate));m_pFpgaContent->setText(QString("%1").arg(vers.fpgaContent));
}
其中有两点:fpga推给上位机的数据是一个int类型的如 int date = 20210212;需要转换
还有QSetting的用法,是为了单独去改变其中的一个值,写入文件,后期读取,如果FPga有推送版本,就更新对应的值,然后用UI的update,函数,来更新UI的改变。