#include "cmainwindow.h" #include "ui_cmainwindow.h" #include "mainwindowpagecontrol.h" #include "currentuserdata.h" #include #include #include #include #include #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"); 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()<::of(&QProcess::finished),[this] // (int exitCode,QProcess::ExitStatus exitStatus){ // m_exitCode = exitCode; // m_exitStatus = exitStatus; // qDebug()<<"m_exitCode"<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; } }