Files
EJM_Display/LaunchPage.cpp
2025-10-21 11:11:52 +08:00

896 lines
40 KiB
C++
Raw 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 "LaunchPage.h"
#include "ui_LaunchPage.h"
#include <PublicFunctions/Basic.h>
#include <QTimer>
#include <QDebug>
#include <QMetaObject>
#include <QtConcurrent/QtConcurrent>
#include <QFuture>
#include <QThread>
#if CONFIG_EN_SUB_THREAD
#include <Threads/SubThread.h>
SubThread LP_ST;
#endif
uint8_t PageNumber = 17;
// WindowWorker类实现
void WindowWorker::initialize()
{
// 执行耗时的数据初始化工作
QVariant initData;
// 根据不同页面索引准备不同的数据
switch(m_pageIndex) {
case 1:{emit logMessage(QString("线程初始化->准备 主预览 数据..."));
}break;
case 2:{emit logMessage(QString("线程初始化->准备 屏蔽条件 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_屏蔽界面文本_配置 文件..."));
ShieldConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_屏蔽界面文本_配置.csv");
}break;
case 3:{emit logMessage(QString("线程初始化->准备 油泵设备 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_油泵界面启停条件_配置 文件..."));
PumpConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_油泵界面启停条件_配置.csv");
}break;
case 4:{emit logMessage(QString("线程初始化->准备 截割设备 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_截割界面启停条件_配置 文件"));
CutConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_截割界面启停条件_配置.csv");
}break;
case 5:{emit logMessage(QString("线程初始化->准备 装载设备 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_装载界面启停条件_配置 文件"));
LoaderConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_装载界面启停条件_配置.csv");
}break;
case 6:{emit logMessage(QString("线程初始化->准备 运输设备 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_运输界面启停条件_配置 文件"));
TransportConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_运输界面启停条件_配置.csv");
}break;
case 7:{emit logMessage(QString("线程初始化->准备 备用设备 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_备用界面启停条件_配置 文件"));
StandbyConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_备用界面启停条件_配置.csv");
}break;
case 8:{emit logMessage(QString("线程初始化->准备 故障记录 数据..."));
emit logMessage(QString("线程初始化->异步读取 UI_报警内容文本_配置 文件"));
QList<QStringList> FileData = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_报警内容文本_配置.csv");
emit logMessage(QString("线程初始化->解析 UI_报警内容文本_配置 文件"));
for (int row = 1; row < FileData.size()-1; ++row)
{
bool ok1,ok2;
uint8_t Dev = FileData.at(row)[0].toUInt(&ok1, 16);
uint8_t Index = FileData.at(row)[1].toUInt(&ok2, 16);
AlarmText[Dev][Index].TextColor = FileData.at(row)[2];
AlarmText[Dev][Index].AlarmText = FileData.at(row)[3] + "->" + FileData.at(row)[4];
AlarmText[Dev][Index].Troubleshoot = FileData.at(row)[5];
}
}break;
case 9:{emit logMessage(QString("线程初始化->准备 遥控测试 数据..."));
}break;
case 10:{emit logMessage(QString("线程初始化->准备 自动智能 数据..."));
}break;
case 11:{emit logMessage(QString("线程初始化->准备 绝缘检测 数据..."));
}break;
case 12:{emit logMessage(QString("线程初始化->准备 网络拓扑 数据..."));
}break;
case 13:{emit logMessage(QString("线程初始化->准备 本地控制 数据..."));
}break;
case 14:{emit logMessage(QString("线程初始化->准备 随机图册 数据..."));
}break;
case 15:{emit logMessage(QString("线程初始化->准备 参数设置 数据..."));
}break;
case 16:{emit logMessage(QString("线程初始化->准备 系统设置 数据..."));
}break;
}
m_initialized = true;
// 先请求创建窗口,然后再通知初始化完成
emit createWindowRequest(m_pageIndex);
emit initializationComplete(m_pageIndex, initData);
// 关键:完成工作后退出线程
QThread::currentThread()->quit();
}
// LaunchPage类实现
LaunchPage::LaunchPage(QWidget *parent)
: QWidget(parent)
, ui(new Ui::LaunchPage)
{
ui->setupUi(this);
WinInit();
#if CONFIG_EN_SUB_THREAD
LP_ST.start();
#endif
QTimer::singleShot(10, this, &LaunchPage::createPages);
}
LaunchPage::~LaunchPage()
{
#if CONFIG_EN_SUB_THREAD
LP_ST.KillThread();
#endif
// 清理所有工作线程
for (QThread *thread : workerThreads) {
if (thread && thread->isRunning()) {
thread->quit();
if (!thread->wait(500)) {
thread->terminate();
}
}
delete thread;
}
delete ui;
// 清理TTS
if (tts) {
tts->stop();
delete tts;
}
}
void LaunchPage::AddLogInfo(QString Str)
{
Sleep_ms(1);
ui->Logs->addItem(Str);
ui->Logs->setCurrentRow(ui->Logs->count() - 1);
qDebug()<<Str;
}
void LaunchPage::TrayIconInit()
{
QIcon icon = QIcon("logo.png"); ui->Percentage->setNum(2);
trayIcon = new QSystemTrayIcon(this); ui->Percentage->setNum(3);
trayIcon->setIcon(icon); ui->Percentage->setNum(4);
trayIcon->setToolTip("郑煤机-掘锚一体机"); ui->Percentage->setNum(5);
trayIcon->show(); ui->Percentage->setNum(6);
minimizeAction = new QAction("隐藏", this); ui->Percentage->setNum(7);
connect(minimizeAction, &QAction::triggered, this, &LaunchPage::hide); ui->Percentage->setNum(8);
restoreAction = new QAction("还原", this); ui->Percentage->setNum(9);
connect(restoreAction, &QAction::triggered, this, &LaunchPage::showNormal); ui->Percentage->setNum(10);
quitAction = new QAction("退出", this); ui->Percentage->setNum(11);
connect(quitAction, &QAction::triggered, this, [this]() {
qApp->quit();
}); ui->Percentage->setNum(12);
trayIconMenu = new QMenu(this); ui->Percentage->setNum(13);
trayIconMenu->addAction(minimizeAction); ui->Percentage->setNum(14);
trayIconMenu->addAction(restoreAction); ui->Percentage->setNum(15);
trayIconMenu->addSeparator(); ui->Percentage->setNum(16);
trayIconMenu->addAction(quitAction); ui->Percentage->setNum(17);
trayIcon->setContextMenu(trayIconMenu); ui->Percentage->setNum(18);
connect(trayIcon, &QSystemTrayIcon::activated, this, [this](QSystemTrayIcon::ActivationReason reason) {
if (reason == QSystemTrayIcon::Trigger) {
this->showNormal();
}
}); ui->Percentage->setNum(19);
}
void LaunchPage::createPages()
{
/* ============= 1. 只把主窗口 show 出来 ============= */
AddLogInfo("窗口创建->正在创建公共窗口...");
pubWin = new P00_PublicPage(this); ui->Percentage->setNum(29);
pubWin->setObjectName("pubWin"); ui->Percentage->setNum(30);
pubWin->setStyleSheet("background-color: transparent;");ui->Percentage->setNum(31);
AddLogInfo("窗口布局->正在共享窗口布局...");
// 获取PublicWin中的scrollArea
scrollArea = pubWin->findChild<QScrollArea*>("scrollArea");ui->Percentage->setNum(32);
isNewScrollArea = false; ui->Percentage->setNum(33);
if (!scrollArea) {
// 如果找不到scrollArea创建新的并添加到PublicWin布局
scrollArea = new QScrollArea(pubWin);
scrollArea->setObjectName("scrollArea");
isNewScrollArea = true;
qDebug() << "创建新的scrollArea";
}ui->Percentage->setNum(34);
AddLogInfo("窗口属性->正在设置窗口属性...");
scrollArea->setStyleSheet("background-color: transparent; border: none;");ui->Percentage->setNum(35);
// 配置滚动区域属性
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);ui->Percentage->setNum(36);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);ui->Percentage->setNum(37);
scrollArea->setWidgetResizable(false); ui->Percentage->setNum(38);// 关键:保持内容原始尺寸以实现横向滚动
scrollArea->setStyleSheet("border: none;");ui->Percentage->setNum(39);
// 创建容器部件 - 用于承载水平排列的窗口
container = new QWidget(); ui->Percentage->setNum(40);
container->setObjectName("scrollContainer"); ui->Percentage->setNum(41);
container->setStyleSheet("background-color: transparent;"); ui->Percentage->setNum(42);
// 使用水平布局
hLayout = new QHBoxLayout(container); ui->Percentage->setNum(43);
hLayout->setSpacing(10); ui->Percentage->setNum(44);// 窗口之间的间距
hLayout->setContentsMargins(0, 0, 0, 0); ui->Percentage->setNum(45); // 容器内边距
// 初始化窗口计数器
windowsCreated = 1; ui->Percentage->setNum(46);
currentLoadingIndex = 0; // 当前加载的窗口索引从0开始
// 容器初始化完成进度推进到48
ui->Percentage->setNum(48);
// 启动顺序加载
startNextWindowLoading(); ui->Percentage->setNum(47);
}
void LaunchPage::startNextWindowLoading()
{
// 直接按顺序加载每个窗口,不使用异步信号槽机制
for (currentLoadingIndex = 0; currentLoadingIndex < PageNumber; currentLoadingIndex++) {
AddLogInfo(QString("开始加载第 %1 个窗口").arg(currentLoadingIndex + 1)); // 日志显示从1开始
// 按窗口索引分阶段设置进度50~98
int progress = 50 + currentLoadingIndex * 3; // 0→50, 1→53, ..., 15→98
ui->Percentage->setNum(progress);
// 先手动执行窗口初始化数据的工作
WindowWorker worker(currentLoadingIndex);
// 手动处理日志消息
connect(&worker, &WindowWorker::logMessage, this, &LaunchPage::AddLogInfo);
// 手动执行初始化
QVariant initData;
// 根据不同页面索引准备不同的数据复制WindowWorker::initialize方法中的数据初始化代码
switch(currentLoadingIndex) {
case 1:{AddLogInfo(QString("手动初始化->准备 主预览 数据..."));
}break;
case 2:{AddLogInfo(QString("手动初始化->准备 屏蔽条件 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_屏蔽界面文本_配置 文件..."));
ShieldConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_屏蔽界面文本_配置.csv");
}break;
case 3:{AddLogInfo(QString("手动初始化->准备 油泵设备 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_油泵界面启停条件_配置 文件..."));
PumpConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_油泵界面启停条件_配置.csv");
}break;
case 4:{AddLogInfo(QString("手动初始化->准备 截割设备 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_截割界面启停条件_配置 文件"));
CutConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_截割界面启停条件_配置.csv");
}break;
case 5:{AddLogInfo(QString("手动初始化->准备 装载设备 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_装载界面启停条件_配置 文件"));
LoaderConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_装载界面启停条件_配置.csv");
}break;
case 6:{AddLogInfo(QString("手动初始化->准备 运输设备 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_运输界面启停条件_配置 文件"));
TransportConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_运输界面启停条件_配置.csv");
}break;
case 7:{AddLogInfo(QString("手动初始化->准备 备用设备 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_备用界面启停条件_配置 文件"));
StandbyConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_备用界面启停条件_配置.csv");
}break;
case 8:{AddLogInfo(QString("手动初始化->准备 故障记录 数据..."));
AddLogInfo(QString("手动初始化->读取 UI_报警内容文本_配置 文件"));
QList<QStringList> FileData = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_报警内容文本_配置.csv");
AddLogInfo(QString("手动初始化->解析 UI_报警内容文本_配置 文件"));
for (int row = 1; row < FileData.size()-1; ++row)
{
bool ok1,ok2;
uint8_t Dev = FileData.at(row)[0].toUInt(&ok1, 16);
uint8_t Index = FileData.at(row)[1].toUInt(&ok2, 16);
AlarmText[Dev][Index].TextColor = FileData.at(row)[2];
AlarmText[Dev][Index].AlarmText = FileData.at(row)[3] + "->" + FileData.at(row)[4];
AlarmText[Dev][Index].Troubleshoot = FileData.at(row)[5];
}
}break;
// 其他页面也可以在这里添加初始化代码
}
// 保存初始化数据
storeWindowData(currentLoadingIndex, initData);
// 处理窗口创建请求(直接调用)
createWindowInMainThread(currentLoadingIndex);
// 等待一小段时间让UI更新
QCoreApplication::processEvents();
}
// 所有窗口加载完成后的处理
AddLogInfo("所有窗口加载完成");
// 设置进度为99%(启动成功)
ui->Percentage->setNum(99);
// 隐藏滚动条(如果需要)
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 水平滚动条按需显示
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏垂直滚动条
// 设置滚动区域的内容部件
scrollArea->setWidget(container);
// 确保scrollArea被正确添加到PublicWin中
if (isNewScrollArea) {
// 为PublicWin设置布局如果没有
if (!pubWin->layout()) {
QVBoxLayout *mainLayout = new QVBoxLayout(pubWin);
mainLayout->setContentsMargins(0, 0, 0, 0);
pubWin->setLayout(mainLayout);
}
// 将滚动区域添加到布局
pubWin->layout()->addWidget(scrollArea);
}
// 显示主窗口
ui->Logs->clear();
ui->Logs->setStyleSheet("border-image: url(:/Frames/null.png);");
pubWin->show();
}
void LaunchPage::createWindowInMainThread(int pageIndex)
{
if (pageIndex < 0 || pageIndex >= PageNumber) {
AddLogInfo(QString("无效的窗口索引: %1跳过创建").arg(pageIndex));
return;
}
QWidget *window = nullptr;
// 在主线程中创建窗口
switch (pageIndex) {
case 1:
{window = new P01_MianPage(container); AddLogInfo("窗口创建->P01_MianPage窗口...");}break;
case 2:
{window = new P02_ShieldPage(container); AddLogInfo("窗口创建->P02_ShieldPage窗口...");
}break;
case 3:
{window = new P301_PumpPage(container); AddLogInfo("窗口创建->P301_PumpPage窗口...");
}break;
case 4:
{window = new P401_CuttingPage(container); AddLogInfo("窗口创建->P401_CuttingPage窗口...");
}break;
case 5:
{window = new P501_LoaderPage(container); AddLogInfo("窗口创建->P501_LoaderPage窗口...");
}break;
case 6:
{window = new P601_TransportPage(container); AddLogInfo("窗口创建->P601_TransportPage窗口...");
}break;
case 7:
{window = new P07_CylinderPage(container); AddLogInfo("窗口创建->P07_CylinderPage窗口...");}break;
case 8:
{window = new P08_AlarmPage(container); AddLogInfo("窗口创建->P08_AlarmPage窗口...");
}break;
case 9: {
switch (PageConfig_RemoteIndex) {
case 1:{window = new P901_RemotePage(container);AddLogInfo("窗口创建->P901_RemotePage窗口...");}break;
case 2:{window = new P902_RemotePage(container);AddLogInfo("窗口创建->P902_RemotePage窗口...");}break;
default:{window = new P901_RemotePage(container);AddLogInfo("窗口创建->P901_RemotePage窗口...");}break;
}
}break;
case 10:
{window = new P10_IntelligentPage(container);AddLogInfo("窗口创建->P10_IntelligentPage窗口...");
}break;
case 11:
{window = new P11_IsolationPage(container); AddLogInfo("窗口创建->P11_IsolationPage窗口...");
}break;
case 12:
{window = new P12_NetworkPage(container); AddLogInfo("窗口创建->P12_NetworkPage窗口...");
}break;
case 13:
{window = new P13_InsPage(container); AddLogInfo("窗口创建->P13_InsPage窗口...");}break;
case 14:
{window = new P14_AtlasPage(container); AddLogInfo("窗口创建->P14_AtlasPage窗口...");
}break;
case 15:
{window = new P15_ParameterPage(container); AddLogInfo("窗口创建->P15_ParameterPage窗口...");}break;
case 16:
{window = new P16_SettingPage(container); AddLogInfo("窗口创建->P16_SettingPage窗口...");}break;
default:
{AddLogInfo(QString("无效的窗口索引: %1").arg(pageIndex));}return;
}
if (window) {
window->setObjectName(QString("window_%1").arg(pageIndex));
window->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
hLayout->addWidget(window);
window->show();
// 复杂的信号连接检查
if (pageIndex != currentLoadingIndex) {
qCritical()<<"窗口载入失败!"<<pageIndex<<currentLoadingIndex;
// 如果索引不匹配,尝试重新加载正确的窗口
QTimer::singleShot(100, this, [this, pageIndex]() {
qDebug() << "尝试重新加载窗口:" << pageIndex;
createWindowInMainThread(currentLoadingIndex);
});
return;
}
}
// 验证窗口是否正确创建
if (window && hLayout->indexOf(window) >= 0) {
AddLogInfo(QString("窗口验证->窗口 %1 创建成功").arg(pageIndex));
emit windowCreationCompleted();
} else {
qCritical()<<"窗口添加失败:"<<pageIndex;
// 重试创建窗口
QTimer::singleShot(100, this, [this, pageIndex]() {
createWindowInMainThread(pageIndex);
});
}
}
void LaunchPage::storeWindowData(int pageIndex, const QVariant &data)
{
windowData[pageIndex] = data;
}
void LaunchPage::WinInit()
{
ConfigFiles().SystemConfig();
LoadGif();
TrayIconInit(); ui->Percentage->setNum(1);
gPageIndexStr = "P01"; ui->Percentage->setNum(20);
// 创建TTS实例
ttsManager = new TTSManager(this); ui->Percentage->setNum(21);
AddLogInfo("环境检测->正在判断是否具有语音播报能力...");
tts = new QTextToSpeech(this); ui->Percentage->setNum(22);
tts->setLocale(QLocale("zh_CN")); ui->Percentage->setNum(23);
tts->setRate(0.0); ui->Percentage->setNum(24);
tts->setPitch(1.0); ui->Percentage->setNum(25);
tts->setVolume(1.0); ui->Percentage->setNum(26);
qDebug() << "可用语音列表:";
for (const QVoice &v : tts->availableVoices()) {
qDebug() << v.name();
}
ui->Percentage->setNum(27);
connect(tts, &QTextToSpeech::stateChanged,
[](QTextToSpeech::State s){
if (s == QTextToSpeech::Ready)
qDebug() << "TTS ready";
});ui->Percentage->setNum(28);
}
void LaunchPage::LoadGif() {
ui->Percentage->setText("");
// 设置窗口透明效果
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
// 设置内容区域背景透明
ui->Logs->setAttribute(Qt::WA_TranslucentBackground);
// 去除边框
ui->Logs->setFrameShape(QFrame::NoFrame);
// 水平滚动条永远隐藏
ui->Logs->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 垂直滚动条永远隐藏
ui->Logs->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 配置标签以支持缩放
ui->LoadGif->setScaledContents(true);
ui->LoadGif->setAlignment(Qt::AlignCenter);
// 播放第一个GIF
m_movie = new QMovie(ConfigurationPath + "Gif动画/LaunchStart.gif", QByteArray(), this);
if (m_movie->isValid()) {
ui->LoadGif->setMovie(m_movie);
m_movie->start();
ui->Percentage->show();
// 使用非阻塞延时避免覆盖当前movie
QTimer::singleShot(780, this, [=]() {
// 延时后播放第二个GIF
QMovie* newMovie = new QMovie(ConfigurationPath + "Gif动画/LaunchLoop.gif", QByteArray(), this);
if (newMovie->isValid()) {
// 停止并清理第一个GIF
m_movie->stop();
delete m_movie;
// 播放第二个GIF
m_movie = newMovie;
ui->LoadGif->setMovie(m_movie);
m_movie->start();
} else {
ui->LoadGif->setText("无法加载第二个GIF");
delete newMovie;
}
});
} else {
ui->LoadGif->setText("无法加载第一个GIF");
delete m_movie;
m_movie = nullptr;
}
}
//#include "LaunchPage.h"
//#include "ui_LaunchPage.h"
//#include <PublicFunctions/Basic.h>
//#if CONFIG_EN_SUB_THREAD //是否开启子进程
// #include <Threads/SubThread.h>
// SubThread LP_ST;
//#endif
//LaunchPage::LaunchPage(QWidget *parent)
// : QWidget(parent)
// , ui(new Ui::LaunchPage)
//{
// ui->setupUi(this);
// setWindowFlag(Qt::FramelessWindowHint); // 设置窗口无边框,设置后窗口无法移动
// setAttribute(Qt::WA_TranslucentBackground, true);
//#if CONFIG_EN_SUB_THREAD //是否开启子进程
// LP_ST.start();
//#endif
// QTimer::singleShot(10, this, &LaunchPage::createPages);
//}
//LaunchPage::~LaunchPage()
//{
//#if CONFIG_EN_SUB_THREAD //是否开启子进程
// LP_ST.KillThread();
//#endif
// delete ui;
// // 清理TTS
// if (tts) {
// tts->stop();
// delete tts;
// }
//}
//void LaunchPage::AddLogInfo(QString Str){
// Sleep_ms(1);
// //ui->LoaderList->addItem(Str);
// //ui->LoaderList->setCurrentRow(ui->LoaderList->count() - 1);
// qDebug()<<Str;
//}
//void LaunchPage::TrayIconInit()
//{
// //托盘初始化
// QIcon icon = QIcon("logo.png");
// trayIcon = new QSystemTrayIcon(this);
// trayIcon->setIcon(icon);
// trayIcon->setToolTip("郑煤机-掘锚一体机");
// trayIcon->show(); //必须调用,否则托盘图标不显示
// //创建菜单项动作(以下动作只对windows有效)
// minimizeAction = new QAction("隐藏", this);
// connect(minimizeAction, SIGNAL(triggered()), this, SLOT(
// hide()
// )); //绑定信号槽
// restoreAction = new QAction("还原", this);
// connect(restoreAction, SIGNAL(triggered()), this, SLOT(
// showNormal()
// ));
// quitAction = new QAction("退出", this);
// connect(quitAction, &QAction::triggered, this, [this]() {
// // 退出应用程序
// qApp->quit();
// });
// //创建托盘菜单(必须先创建动作,后添加菜单项,还可以加入菜单项图标美化)
// trayIconMenu = new QMenu(this);
// trayIconMenu->addAction(minimizeAction);
// trayIconMenu->addAction(restoreAction);
// trayIconMenu->addSeparator();
// trayIconMenu->addAction(quitAction);
// trayIcon->setContextMenu(trayIconMenu);
// connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
// this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
//}
//void LaunchPage::createPages(){
// WinInit();
// /* ============= 1. 只把主窗口 show 出来 ============= */
// AddLogInfo("窗口创建->正在创建公共窗口...");
// P00_PublicPage *pubWin = new P00_PublicPage(this);
// pubWin->setObjectName("pubWin");
// pubWin->setStyleSheet("background-color: transparent;");
// AddLogInfo("窗口布局->正在共享窗口布局...");
// // 获取PublicWin中的scrollArea
// QScrollArea *scrollArea = pubWin->findChild<QScrollArea*>("scrollArea");
// bool isNewScrollArea = false;
// if (!scrollArea) {
// // 如果找不到scrollArea创建新的并添加到PublicWin布局
// scrollArea = new QScrollArea(pubWin);
// scrollArea->setObjectName("scrollArea");
// isNewScrollArea = true;
// qDebug() << "创建新的scrollArea";
// }
// AddLogInfo("窗口属性->正在设置窗口属性...");
// scrollArea->setStyleSheet("background-color: transparent; border: none;");
// // 配置滚动区域属性
// scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
// scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// scrollArea->setWidgetResizable(false); // 关键:保持内容原始尺寸以实现横向滚动
// scrollArea->setStyleSheet("border: none;");
// // 创建容器部件 - 用于承载水平排列的窗口
// QWidget *container = new QWidget();
// container->setObjectName("scrollContainer");
// container->setStyleSheet("background-color: transparent;");
// // 使用水平布局
// QHBoxLayout *hLayout = new QHBoxLayout(container);
// hLayout->setSpacing(10); // 窗口之间的间距
// hLayout->setContentsMargins(0, 0, 0, 0); // 容器内边距
// for (uint8_t PgaeIndex = 0; PgaeIndex < 16; PgaeIndex ++) {
// switch (PgaeIndex) {
// case 0: {
// P01_MianPage *p01 = new P01_MianPage(container);
// AddLogInfo("窗口创建->P01_MianPage窗口...");
// p01->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p01);
// AddLogInfo("窗口载入布局->P01_MianPage 窗口...");
// break;
// }
// case 1: {
// P02_ShieldPage *p02 = new P02_ShieldPage(container);
// AddLogInfo("窗口创建->P02_ShieldPage窗口...");
// p02->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p02);
// AddLogInfo("窗口载入布局->P02_ShieldPage 窗口...");
// break;
// }
// case 2: {
// P301_PumpPage *p301 = new P301_PumpPage(container);
// AddLogInfo("窗口创建->P301_PumpPage窗口...");
// p301->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p301);
// AddLogInfo("窗口载入布局->P301_PumpPage 窗口...");
// break;
// }
// case 3: {
// P401_CuttingPage *p401 = new P401_CuttingPage(container);
// AddLogInfo("窗口创建->P401_CuttingPage窗口...");
// p401->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p401);
// AddLogInfo("窗口载入布局->P401_CuttingPage 窗口...");
// break;
// }
// case 4: {
// P501_LoaderPage *p501 = new P501_LoaderPage(container);
// AddLogInfo("窗口创建->P501_LoaderPage窗口...");
// p501->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p501);
// AddLogInfo("窗口载入布局->P501_LoaderPage 窗口...");
// break;
// }
// case 5: {
// P601_TransportPage *p601 = new P601_TransportPage(container);
// AddLogInfo("窗口创建->P601_TransportPage窗口...");
// p601->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p601);
// AddLogInfo("窗口载入布局->P601_TransportPage 窗口...");
// break;
// }
// case 6: {
// P07_CylinderPage *p07 = new P07_CylinderPage(container);
// AddLogInfo("窗口创建->P07_CylinderPage窗口...");
// p07->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p07);
// AddLogInfo("窗口载入布局->P07_CylinderPage 窗口...");
// break;
// }
// case 7: {
// P08_AlarmPage *p08 = new P08_AlarmPage(container);
// AddLogInfo("窗口创建->P08_AlarmPage窗口...");
// p08->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p08);
// AddLogInfo("窗口载入布局->P08_AlarmPage 窗口...");
// break;
// }
// case 8: {
// switch (PageConfig_RemoteIndex) {
// case 1:{
// P901_RemotePage *p09 = new P901_RemotePage(container);
// AddLogInfo("窗口创建->P901_RemotePage窗口...");
// p09->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p09);
// AddLogInfo("窗口载入布局->P901_RemotePage 窗口...");
// break;
// }
// case 2:{
// P902_RemotePage *p09 = new P902_RemotePage(container);
// AddLogInfo("窗口创建->P902_RemotePage窗口...");
// p09->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p09);
// AddLogInfo("窗口载入布局->P902_RemotePage 窗口...");
// break;
// }
// default:{
// P901_RemotePage *p09 = new P901_RemotePage(container);
// AddLogInfo("窗口创建->P09_RemotePage窗口...");
// p09->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p09);
// AddLogInfo("窗口载入布局->P09_RemotePage 窗口...");
// break;
// }
// }
// break;
// }
// case 9: {
// P10_IntelligentPage *p10 = new P10_IntelligentPage(container);
// AddLogInfo("窗口创建->P10_IntelligentPage窗口...");
// p10->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p10);
// AddLogInfo("窗口载入布局->P10_IntelligentPage 窗口...");
// break;
// }
// case 10: {
// P11_IsolationPage *p11 = new P11_IsolationPage(container);
// AddLogInfo("窗口创建->P11_IsolationPage窗口...");
// p11->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p11);
// AddLogInfo("窗口载入布局->P11_IsolationPage 窗口...");
// break;
// }
// case 11: {
// P12_NetworkPage *p12 = new P12_NetworkPage(container);
// AddLogInfo("窗口创建->P12_NetworkPage窗口...");
// p12->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p12);
// AddLogInfo("窗口载入布局->P12_NetworkPage 窗口...");
// break;
// }
// case 12: {
// P13_InsPage *p13 = new P13_InsPage(container);
// AddLogInfo("窗口创建->P13_InsPage窗口...");
// p13->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p13);
// AddLogInfo("窗口载入布局->P13_InsPage 窗口...");
// break;
// }
// case 13: {
// P14_AtlasPage *p14 = new P14_AtlasPage(container);
// AddLogInfo("窗口创建->P14_AtlasPage窗口...");
// p14->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p14);
// AddLogInfo("窗口载入布局->P14_AtlasPage 窗口...");
// break;
// }
// case 14: {
// P15_ParameterPage *p15 = new P15_ParameterPage(container);
// AddLogInfo("窗口创建->P15_ParameterPage窗口...");
// p15->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p15);
// AddLogInfo("窗口载入布局->P15_ParameterPage 窗口...");
// break;
// }
// case 15: {
// P16_SettingPage *p16 = new P16_SettingPage(container);
// AddLogInfo("窗口创建->P16_SettingPage窗口...");
// p16->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// hLayout->addWidget(p16);
// AddLogInfo("窗口载入布局->P16_SettingPage 窗口...");
// break;
// }
// default:
// // 所有窗口加载完成,可以添加完成提示
// AddLogInfo("所有窗口加载完成");
// }
// }
// // 隐藏滚动条(如果需要)
// scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 水平滚动条按需显示
// scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏垂直滚动条
// // 设置滚动区域的内容部件
// scrollArea->setWidget(container);
// // 确保scrollArea被正确添加到PublicWin中
// if (isNewScrollArea) {
// // 为PublicWin设置布局如果没有
// if (!pubWin->layout()) {
// QVBoxLayout *mainLayout = new QVBoxLayout(pubWin);
// mainLayout->setContentsMargins(0, 0, 0, 0);
// pubWin->setLayout(mainLayout);
// }
// // 将滚动区域添加到布局
// pubWin->layout()->addWidget(scrollArea);
// }
// // 显示主窗口
// //ui->LoaderList->clear();
// //ui->LoaderList->setStyleSheet("border-image: url(:/Frames/null.png);");
// pubWin->show();
//}
//void LaunchPage::WinInit(){
// //ui->LoaderList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// //ui->LoaderList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// ConfigFiles().SystemConfig();
// TrayIconInit();
// AddLogInfo("读取配置->UI_油泵界面启停条件_配置...");
// PumpConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_油泵界面启停条件_配置.csv");
// AddLogInfo("读取配置->UI_截割界面启停条件_配置...");
// CutConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_截割界面启停条件_配置.csv");
// AddLogInfo("读取配置->UI_装载界面启停条件_配置...");
// LoaderConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_装载界面启停条件_配置.csv");
// AddLogInfo("读取配置->UI_运输界面启停条件_配置...");
// TransportConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_运输界面启停条件_配置.csv");
// AddLogInfo("读取配置->UI_备用界面启停条件_配置...");
// StandbyConditionConfigFile = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_备用界面启停条件_配置.csv");
// AddLogInfo("解析配置->UI_报警内容文本_配置...");
// QTimer::singleShot(1000, this, [=]() {
// AddLogInfo("读取配置->UI_报警内容文本_配置...");
// QList<QStringList> FileData = ConfigFiles().ReadFile_Csv(ConfigurationPath + "画面配置/UI_报警内容文本_配置.csv");
// for (int row = 1; row < FileData.size()-1; ++row)
// {
// bool ok1,ok2;
// uint8_t Dev = FileData.at(row)[0].toUInt(&ok1, 16);
// uint8_t Index = FileData.at(row)[1].toUInt(&ok2, 16);
// AlarmText[Dev][Index].TextColor = FileData.at(row)[2];
// AlarmText[Dev][Index].AlarmText = FileData.at(row)[3] + "->" + FileData.at(row)[4];
// AlarmText[Dev][Index].Troubleshoot = FileData.at(row)[5];
// }
// });
// AddLogInfo("界面解析->正在解析所有界面名称...");
// gPageName["P01"] = "主预览";
// gPageName["P02"] = "屏蔽条件";
// gPageName["P301"] = "油泵设备";
// gPageName["P401"] = "截割设备";
// gPageName["P501"] = "装载设备";
// gPageName["P601"] = "运输设备";
// gPageName["P07"] = "备用设备";
// gPageName["P08"] = "故障记录";
// gPageName["P09"] = "遥控测试";
// gPageName["P10"] = "自动智能";
// gPageName["P11"] = "绝缘检测";
// gPageName["P12.00"] = "网络拓扑";
// gPageName["P12.01"] = "硬件IO 1";
// gPageName["P12.02"] = "硬件IO 2";
// gPageName["P12.03"] = "硬件IO 3";
// gPageName["P12.04"] = "硬件IO 4";
// gPageName["P12.05"] = "硬件IO 3";
// gPageName["P12.06"] = "操作箱 1";
// gPageName["P12.07"] = "操作箱 2";
// gPageName["P12.08"] = "操作箱 3";
// gPageName["P12.09"] = "操作箱 4";
// gPageName["P13"] = "本地控制";
// gPageName["P14"] = "随机图册";
// gPageName["P15"] = "参数设置";
// gPageName["P16"] = "系统设置";
// gPageIndexStr = "P01";
// // 创建实例(建议全局唯一)
// ttsManager = new TTSManager(this);
// AddLogInfo("读取配置->正在判断是否具有语音播报能力...");
// // 初始化TTS
// tts = new QTextToSpeech(this);
// tts->setLocale(QLocale("zh_CN"));
// tts->setRate(0.0);
// tts->setPitch(1.0);
// tts->setVolume(1.0);
// qDebug() << "可用语音列表:";
// for (const QVoice &v : tts->availableVoices()) {
// qDebug() << v.name();
// }
// connect(tts, &QTextToSpeech::stateChanged,
// [](QTextToSpeech::State s){
// if (s == QTextToSpeech::Ready)
// qDebug() << "TTS ready";
// });
//}