#include "mainwidget.h" #include "ui_mainwidget.h" #include #include "mainconfig.h" #define NAMELIST_LENGTH 4 QString namelist[] = {"传十一","传十三","传十五","传十七"}; qint8 gindex = 0; MainWidget::MainWidget(HttpService *httpService, WebsocketService *websocketService, DeviceService *deviceService, QWidget *parent) : m_httpService(httpService), m_websocketService(websocketService), m_deviceService(deviceService), QWidget(parent), ui(new Ui::MainWidget) { ui->setupUi(this); m_patientIndex = 0; m_wsConnectedStatus = 0; m_maxPatientNum = MainConfig::maxPatientNum.toInt(); m_switchPatientInterval = MainConfig::switchPatientInterval.toInt(); keyDownPInfo = Q_NULLPTR;//zhixiang kongzhizhen //1s倒计时 m_countDownTimer.setInterval(1000); m_countDownTimer.start(); connect(&m_countDownTimer, &QTimer::timeout,[=](){ for(PatientEmergencyInfo *info : m_patientEmergencyInfos){ if(info->realCountDownInSeconds > 0){ info->realCountDownInSeconds--; } } updateUi(); }); //切换病人 m_switchPatientTimer.setInterval(m_switchPatientInterval * 1000); m_switchPatientTimer.start(); connect(&m_switchPatientTimer, &QTimer::timeout,[=](){ if(++m_patientIndex >= m_patientEmergencyInfos.length()){ m_patientIndex = 0; } updateUi(); m_curX = 0; }); //LED闪烁 m_ledTurnTimer.setInterval(1000); connect(&m_ledTurnTimer, &QTimer::timeout,[=](){ m_deviceService->m_ledStatus ^= 1; m_deviceService->ledSet(m_deviceService->m_ledStatus); }); //显示连接状态 ui->statusLabel->setText("Not Connected"); //显示设置 font1.setPointSize(180); font2.setPointSize(180); font3.setPointSize(20); ui->textLabel->setFont(font1); ui->countdownLabel->setFont(font2); ui->statusLabel->setFont(font3); ui->textLabel->setStyleSheet("QLabel {color: rgb(255,0,0);}");//设置文本红色 ui->countdownLabel->setStyleSheet("QLabel {color: rgb(255,0,0);}");//设置文本红色 ui->statusLabel->setStyleSheet("QLabel {color: rgb(85,255,0);}");//设置文本绿色 // ui->textLabel->setAlignment(Qt::AlignHCenter); // ui->countdownLabel->setAlignment(Qt::AlignHCenter); // ui->statusLabel->setAlignment(Qt::AlignRight); isFenzhen = false; m_curX = 0; connect(&m_lableScrollTimer,SIGNAL(timeout()),this,SLOT(lableScrollDisplay())); m_lableScrollTimer.start(10); this->setCursor(Qt::BlankCursor); } MainWidget::~MainWidget() { delete ui; } void MainWidget::updateUi() { // m_curX = 0;//内容超出显示区域时,更新患者信息显示从头开始滚动 //更新statusLabel // ui->statusLabel->setText(QString("%1 | %2") // .arg(m_wsConnectedStatus == 0 ? "未连接" : "已连接") // .arg(m_patientEmergencyInfos.length()) // ); if(m_wsConnectedStatus){ ui->LEDLabel->setStyleSheet("border-image: url(:/image/1LED_green.png);"); }else{ ui->LEDLabel->setStyleSheet("border-image: url(::/image/1LED_gray.png);"); } if(m_patientEmergencyInfos.length() == 0){ ui->statusLabel->setText(QString::number(m_patientEmergencyInfos.length())); }else{ ui->statusLabel->setText(QString::number(m_patientIndex+1) + "/" + QString::number(m_patientEmergencyInfos.length())); } if(m_patientEmergencyInfos.length() == 0){ //不显示 ui->textLabel->setText(""); ui->countdownLabel->setText(""); return; } //获取当前病人 if(m_patientIndex >= m_patientEmergencyInfos.length()){ m_patientIndex = 0; } PatientEmergencyInfo *pInfo = m_patientEmergencyInfos[m_patientIndex]; //显示文本 ui->textLabel->setText(pInfo->text); //显示倒计时 QString str = ""; if(pInfo->realCountDownInSeconds < 0){ str = ""; isFenzhen = true; }else{ int hour,min,sec,nTotalSecs; nTotalSecs = pInfo->realCountDownInSeconds; sec = nTotalSecs % 60; // min = nTotalSecs / 60 % 60; min = nTotalSecs / 60 ; //min显示大于60 hour = nTotalSecs / 3600; str = QString("%1:%2").arg(min,2,10,QLatin1Char('0')).arg(sec,2,10,QLatin1Char('0')); } ui->countdownLabel->setText(str); } void MainWidget::paintEvent(QPaintEvent *event) { //设置背景图片 QPainter p(this); p.drawPixmap(0,0,this->width(),this->height(),QPixmap(":/image/black_bg.jpg")); // qDebug() << "MainWidget::paintEvent"; //重新调整label字体大小 //TODO } void MainWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); //标题 // ui->textLabel->setGeometry(0,0,this->width(),(this->height()-30)/2); ui->countdownLabel->setGeometry(0,(this->height()-30)/2,this->width(),(this->height()-30)/2); ui->LEDLabel->setGeometry(this->width()-110,this->height()-30,30,30); ui->statusLabel->setGeometry(this->width()-80,this->height()-30,55,30); } void MainWidget::lableScrollDisplay() { // qDebug()<<"m_curX = "<textLabel->text()); m_height = ui->textLabel->height(); if(isFenzhen){ m_y = (this->height()-m_height)/2; } else{ int m_y = 0; } if(this->width() > m_width){ ui->textLabel->setGeometry((this->width()-m_width)/2, m_y,m_width,(this->height()-30)/2); } else{ m_curX ++; ui->textLabel->setGeometry(150-m_curX*5,m_y,m_width,(this->height()-30)/2); } if(m_curX > m_width){ m_curX = 0; } } void MainWidget::onWsConnectedStatusChanged(int status) { qDebug() << "MainWidget::onWsConnectedStatusChanged " << status; m_wsConnectedStatus = status; updateUi(); } void MainWidget::onNewPatientMergencyInfo(QString firstAidId, QString name, QString content, qint64 realCountDownInSeconds) { //TODO 此处是否需要加锁处理 PatientEmergencyInfo *pInfo = new PatientEmergencyInfo(firstAidId,name,content,realCountDownInSeconds); addPatientToList(pInfo); qDebug() << "MainWidget::onNewPatientMergencyInfo " << firstAidId << name << content << realCountDownInSeconds; m_ledTurnTimer.start(); } void MainWidget::onPatientMergencyStatusChanged(QString firstAidId,QString time, QString status) { //TODO firstAidId == null 选择倒计时最小的急救 qDebug() << "MainWidget::onPatientMergencyStatusChanged " << firstAidId << time << status; if(status == 0){ return; } //发送信号,该信号与httpservice的updatestatus请求绑定 emit statusChanged(firstAidId,status); //处理状态改变 if(status == 1){ //进行中(拍了一下按键) }else if(status == 2){//服务环节结束 deletePatientFromList(firstAidId); } } void MainWidget::onKeyClicked() { emit complexOneKeyStart("142733198703123918",::namelist[::gindex],"1","汉族"); qDebug() << "Key Clicked"; if(++::gindex >= NAMELIST_LENGTH){ ::gindex = 0; } } void MainWidget::onKeyDown() { qDebug() << "emit keyDown()"; if(m_patientEmergencyInfos.length() > 0){ keyDownPInfo = m_patientEmergencyInfos[m_patientIndex]; } } void MainWidget::onKeyWorked(KeyFlag flag) { qDebug() << "emit keyWork()" << flag; if(flag == Click){ m_ledTurnTimer.stop(); m_deviceService->m_ledStatus = 0; m_deviceService->ledSet(m_deviceService->m_ledStatus); onKeyClicked(); }else if(flag == Dbl_Click){ qDebug()<<"Key Dbl_Clicked"; //切换病人 if(++m_patientIndex >= m_patientEmergencyInfos.length()){ m_patientIndex = 0; } updateUi(); m_curX = 0; }else if(flag == Press){ qDebug()<<"Key Press"; if(keyDownPInfo != Q_NULLPTR){ deletePatientFromList(keyDownPInfo->id); keyDownPInfo = Q_NULLPTR; } m_deviceService->m_ledStatus = 1; m_deviceService->ledSet(m_deviceService->m_ledStatus); } } void MainWidget::addPatientToList(PatientEmergencyInfo *info) { //1.如果有就删除,以保证同一个病人按两次应该重新开始计时 deletePatientFromList(info->id); //2.如果超过长度,就删除第一个,取后来的 if(m_patientEmergencyInfos.length() >= m_maxPatientNum){ delete m_patientEmergencyInfos[0]; m_patientEmergencyInfos.pop_front(); } //3.加入链表 m_patientEmergencyInfos.push_back(info); onKeyDown();//模拟按键按下 } void MainWidget::deletePatientFromList(QString firstAidId) { for(int i=0;iid == firstAidId){ delete m_patientEmergencyInfos[i]; m_patientEmergencyInfos.removeAt(i); break; } } } void MainWidget::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton){ //TODO } else if(event->button()==Qt::RightButton){ } } //鼠标左键双击,代替按键一下 //鼠标右键双击,代替按键两下 void MainWidget::mouseDoubleClickEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton){ //TODO m_deviceService->key.flag = Click; onKeyWorked(m_deviceService->key.flag); } else if(event->button()==Qt::RightButton){ m_deviceService->key.flag = Dbl_Click; onKeyWorked(m_deviceService->key.flag); } } //鼠标滚动,代替长按 void MainWidget::wheelEvent(QWheelEvent *event) { // 当滚轮远离使用者时 if(event->delta() > 0){ //TODO }else{//当滚轮向使用者方向旋转时 m_deviceService->key.flag = Press; onKeyWorked(m_deviceService->key.flag); } }