2024-11-25 17:15:44 +08:00

302 lines
9.3 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 "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;
}
}