Files
CalibratorLauncher/widgets/statusbar.cpp
2026-01-02 19:20:35 +09:00

157 lines
4.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "statusbar.h"
#include <QHBoxLayout>
#include <QDateTime>
#include <QPalette>
#include <QProcess>
#include <QRegularExpression>
StatusBar::StatusBar(QWidget *parent)
: QWidget(parent), m_batteryLevel(100), m_networkConnected(true), m_networkType("WiFi")
{
setFixedHeight(40);
setupUI();
// 定时更新时间
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &StatusBar::updateTime);
m_timer->start(1000);
updateTime();
// 定时更新电池和WiFi状态每10秒
QTimer *statusTimer = new QTimer(this);
connect(statusTimer, &QTimer::timeout, this, &StatusBar::updateBatteryLevel);
connect(statusTimer, &QTimer::timeout, this, &StatusBar::updateNetworkStatus);
statusTimer->start(10000);
updateBatteryLevel();
updateNetworkStatus();
}
StatusBar::~StatusBar()
{
}
void StatusBar::setupUI()
{
// 透明背景 - Android风格
setAttribute(Qt::WA_TranslucentBackground);
setStyleSheet("background: transparent;");
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setContentsMargins(24, 8, 24, 8);
layout->setSpacing(20);
// 标题 - 使用白色带阴影效果
m_titleLabel = new QLabel("智能校验仪", this);
m_titleLabel->setStyleSheet(R"(
font-size: 16px;
font-weight: 600;
color: white;
background: transparent;
)");
layout->addWidget(m_titleLabel);
layout->addStretch();
// 网络状态
m_networkLabel = new QLabel("\u25CF", this); // 实心圆点
m_networkLabel->setStyleSheet("font-size: 16px; color: rgba(255,255,255,0.9); background: transparent;");
layout->addWidget(m_networkLabel);
// 电池状态
m_batteryLabel = new QLabel("100%", this);
m_batteryLabel->setStyleSheet("font-size: 13px; color: rgba(255,255,255,0.9); background: transparent;");
layout->addWidget(m_batteryLabel);
// 时间
m_timeLabel = new QLabel(this);
m_timeLabel->setStyleSheet("font-size: 13px; min-width: 50px; color: rgba(255,255,255,0.9); background: transparent;");
layout->addWidget(m_timeLabel);
}
void StatusBar::setTitle(const QString &title)
{
m_titleLabel->setText(title);
}
void StatusBar::setBatteryLevel(int level)
{
m_batteryLevel = qBound(0, level, 100);
QString icon = m_batteryLevel > 20 ? "🔋" : "🪫";
m_batteryLabel->setText(QString("%1 %2%").arg(icon).arg(m_batteryLevel));
}
void StatusBar::setNetworkStatus(bool connected, const QString &type)
{
m_networkConnected = connected;
m_networkType = type;
QString icon;
if (!connected)
{
icon = "📵";
}
else if (type == "4G")
{
icon = "📶";
}
else
{
icon = "📶";
}
m_networkLabel->setText(icon);
}
void StatusBar::updateTime()
{
QString timeStr = QDateTime::currentDateTime().toString("HH:mm");
m_timeLabel->setText(timeStr);
}
int StatusBar::getBatteryPercentage()
{
QProcess process;
process.start("pmset", QStringList() << "-g" << "batt");
process.waitForFinished(1000);
QString output = process.readAllStandardOutput();
// 解析输出格式如Now drawing from 'Battery Power' -InternalBattery-0 (id=123456) 85%; discharging; 3:45 remaining
QRegularExpression re("(\\d+)%");
QRegularExpressionMatch match = re.match(output);
if (match.hasMatch())
{
return match.captured(1).toInt();
}
return 100; // 默认值
}
bool StatusBar::isWiFiConnected()
{
QProcess process;
process.start("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport", QStringList() << "-I");
process.waitForFinished(1000);
QString output = process.readAllStandardOutput();
// 如果输出包含SSID说明WiFi已连接
return output.contains("SSID:");
}
void StatusBar::updateBatteryLevel()
{
int level = getBatteryPercentage();
setBatteryLevel(level);
}
void StatusBar::updateNetworkStatus()
{
bool connected = isWiFiConnected();
if (connected)
{
m_networkLabel->setText("\u25CF"); // 实心圆点表示已连接
}
else
{
m_networkLabel->setText("\u25CB"); // 空心圆点表示未连接
}
}