302 lines
9.3 KiB
C++
Raw Normal View History

2024-11-25 17:15:44 +08:00
#include "cmainwindow.h"
#include "ui_cmainwindow.h"
#include "mainwindowpagecontrol.h"
#include "currentuserdata.h"
#include <QDebug>
#include <QTimer>
#include <windows.h>
#include <QHBoxLayout>
#include <QProcess>
#include "gamecontrol.h"
#include "fescontroldialog.h"
CMainWindow::CMainWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::CMainWindow),
m_gameDisplayPage(NULL),
gamedialog(NULL),
grabWindowTimer(NULL)
{
ui->setupUi(this);
ui->title_Widget->hide();
ui->stackedWidget->setGeometry(0,0,1920,1080);
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框
qRegisterMetaType<E_PAGENAME>("E_PAGENAME");
connect(MainWindowPageControl::getInstance(),SIGNAL(signalSwitchPage(E_PAGENAME)),this,SLOT(slotSwitchPage(E_PAGENAME)));
connect(CurrentUserData::getInstace(),SIGNAL(signalUserChanged()),this,SLOT(slotCurrentUserChanged()));
//默认为主界面
// setAttribute(Qt::WA_DeleteOnClose,false);
ui->stackedWidget->setCurrentIndex(0);
m_gameDisplayPage = new GameDisplayPage();
connect(m_gameDisplayPage,SIGNAL(signalGameStateChanged(int8_t)),this,SLOT(slotGameStateChanged(int8_t)));
m_Process = new QProcess();
connect(ui->title_Widget,SIGNAL(signalCloseWindow()),this,SLOT(closeWindow()));
gamedialog = new QDialog;
m_loginWidget = new LoginWidget();
gamedialog->stackUnder(m_gameDisplayPage);
grabWindowTimer = new QTimer();
connect(grabWindowTimer,SIGNAL(timeout()),this,SLOT(slotGrabWindow()));
connect(ui->FES_Page,SIGNAL(signalStartGame()),ui->FESCar_Page,SLOT(slotStartGame()));
//从参数界面传递到训练界面
connect(ui->trainParam_Page,&TrainingParamSetting::signalTrainParamChanged,ui->FESCar_Page,&ArmOrLeg::slotRecvTrainParamChanged);
//训练页面发消息让tittle页面保存截图
connect(ui->FESCar_Page,&ArmOrLeg::saveUpPictureSignal,ui->title_Widget,&TitleWidget::slotSaveUpPicture);
//从训练界面传递到参数界面
connect(ui->FESCar_Page,&ArmOrLeg::signalBicycleParamChanged,ui->trainParam_Page,&TrainingParamSetting::slotBicycleParamChanged);
//训练界面打开,跟新游戏配置默认参数
connect(ui->Main_Page,&TrainManager::signalOpenTrainManagerPage,ui->trainParam_Page,&TrainingParamSetting::slotResetParam);
// connect(m_loginWidget,SIGNAL(signalCloseApp),this,SLOT(closeWindow()));
}
CMainWindow::~CMainWindow()
{
if(gamedialog)
delete gamedialog;
if(m_gameDisplayPage)
delete m_gameDisplayPage;
if(grabWindowTimer)
delete grabWindowTimer;
delete ui;
}
void CMainWindow::switchPage(E_PAGENAME E_Page)
{
switch(E_Page)
{
case MainPage_E:
gamedialog->close();
ui->stackedWidget->setGeometry(0,0,1920,1080);
ui->stackedWidget->setCurrentWidget(ui->Main_Page);
ui->title_Widget->hide();
qDebug() <<"来到了主页";
emit ui->Main_Page->signalOpenTrainManagerPage();
break;
case TrainingPage_E://游戏训练界面
// ui->stackedWidget->setCurrentWidget(ui->game_Page);
startGame_Btn_clicked();
// QTimer::singleShot(1000,this,SLOT(slot_Timerout()));//同上,就是参数不同
break;
case UserPage_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->stackedWidget->setCurrentWidget(ui->userMsg_Page);
ui->title_Widget->show();
break;
case SettingPage_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->stackedWidget->setCurrentWidget(ui->setting_Page);
ui->title_Widget->show();
break;
case BicycleParamSet_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
//qDebug() <<"普通单车";
ui->FESCar_Page->setTrainType(0);
ui->title_Widget->setTrainType(0);
ui->trainParam_Page->setTrainType(0);
ui->stackedWidget->setCurrentWidget(ui->FESCar_Page);
ui->title_Widget->show();
break;
case FesBicycleParamSet_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
//qDebug() <<"FES单车";
ui->FESCar_Page->setTrainType(1);
ui->title_Widget->setTrainType(1);
ui->trainParam_Page->setTrainType(1);
ui->stackedWidget->setCurrentWidget(ui->FESCar_Page);
ui->title_Widget->show();
break;
case FesParamSet_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->title_Widget->setTrainType(0);
ui->FES_Page->switchPage(ONLY_FES_E);
ui->stackedWidget->setCurrentWidget(ui->FES_Page);
ui->title_Widget->show();
break;
case BicycleToFes_E:
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->FES_Page->switchPage(BICYCLE_FES_E);
ui->stackedWidget->setCurrentWidget(ui->FES_Page);
ui->title_Widget->show();
break;
case TrainingParamSetting_E: //训练参数设置页
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->stackedWidget->setCurrentWidget(ui->trainParam_Page);
ui->title_Widget->show();
break;
case BrainTraining: //训练参数设置页
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->stackedWidget->setCurrentWidget(ui->Brain_Page);
ui->title_Widget->show();
break;
case visionTrain: //训练参数设置页
ui->stackedWidget->setGeometry(0,100,1920,980);
ui->stackedWidget->setCurrentWidget(ui->Vision_Page);
ui->title_Widget->show();
break;
default:
break;
}
}
void CMainWindow::slotSwitchPage(E_PAGENAME page)
{
switchPage(page);
ui->title_Widget->setTitleByPage(page);
}
void CMainWindow::slotCurrentUserChanged()
{
ui->title_Widget->setUser(CurrentUserData::getInstace()->getCurrentPatientMsg());
}
void CMainWindow::startGame_Btn_clicked()
{
connect(m_Process,&QProcess::errorOccurred,[=](QProcess::ProcessError error){qDebug()<<error;});
// connect(m_Process,QOverload<int,QProcess::ExitStatus>::of(&QProcess::finished),[this]
// (int exitCode,QProcess::ExitStatus exitStatus){
// m_exitCode = exitCode;
// m_exitStatus = exitStatus;
// qDebug()<<"m_exitCode"<<m_exitCode<<"m_exitStatus"<<m_exitStatus;
// });
QString destPath = GameControl::getInstance()->getCurrentGameMsg().gamePath + GameControl::getInstance()->getCurrentGameMsg().gameName;
startGame(destPath);
grabWindowTimer->start(300);
}
void CMainWindow::slotGrabWindow()
{
WId hwnd = 0;
if(1 == GameControl::getInstance()->getCurrentGameMsg().gameID)
hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ001_SingleplayerBicycleRace");
else if(2 == GameControl::getInstance()->getCurrentGameMsg().gameID)
hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ002_MultiplayerBicycleRace_LBY");
else if(3 == GameControl::getInstance()->getCurrentGameMsg().gameID)
hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ003_MultiplayerRaceSciFi");
else if(4 == GameControl::getInstance()->getCurrentGameMsg().gameID)
hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ004_CatchFish");
if(IsHungAppWindow(HWND(hwnd)))
{
qDebug()<<"正在运行";
}
if(hwnd > 0)
{
grabWindowTimer->stop();
m_window = QWindow::fromWinId(hwnd);
container = createWindowContainer(m_window,this);
gamedialog->setWindowFlags(Qt::FramelessWindowHint);
QGridLayout *hLayout = new QGridLayout(this);
hLayout->setMargin(0);
hLayout->addWidget(container);
if(gamedialog->layout() != NULL)
delete gamedialog->layout();
gamedialog->setLayout(hLayout);
gamedialog->show();
gamedialog->resize(1920,980);
gamedialog->move(0,100);
// m_gameDisplayPage->show();
}
}
void CMainWindow::slotGameStateChanged(int8_t state)
{
switch(state)
{
case 0: //停止游戏
{
m_gameDisplayPage->close();
gamedialog->close();
slotSwitchPage(MainPage_E);
}
break;
case 1: //开始游戏
m_gameDisplayPage->show();
break;
}
}
void CMainWindow::closeWindow()
{
//关闭所有设备
qDebug()<<"运行了";
FesControlDialog::getInstance()->turnoffDevice(1,1);
this->close();
}
void CMainWindow::startGame(QString path)
{
//1.开启游戏进程
if(path.isEmpty())
return;
QString hardDisk = path.mid(0,2);
hardDisk.append("\n\r");
QString gameName = path.mid(path.lastIndexOf('/')+1);
gameName.prepend("start ");
gameName.append("\n\r");
QString gamePath = path.mid(0,path.lastIndexOf('/'));
gamePath.prepend("cd ");
gamePath.append("\n\r");
m_Process->start("cmd.exe");
//切换盘符
m_Process->write(hardDisk.toLatin1());
//进入文件夹
m_Process->write(gamePath.toLatin1());
//开启进程
m_Process->write(gameName.toLatin1());
m_Process->write("exit\n\r");
m_Process->waitForFinished();
m_Process->close();
//2.关闭设备复位中的界面
}
void CMainWindow::slot_Timerout()
{
// m_gameDisplayPage->show();
}
void CMainWindow::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
signalShowCompleted();
}
void CMainWindow::changeEvent(QEvent* event)
{
switch (event->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
QWidget::changeEvent(event);
break;
}
}