#include "gddcdlg.h" #include #include #include #include #include #include #include #include #include #include "ui_gddcdlg.h" #include #pragma comment(lib, "Wtsapi32.lib") using namespace std; DWORD GetmPid(LPCWSTR ProcessName) { PWTS_PROCESS_INFOW wts; DWORD Count; DWORD i = 0; BOOL result = WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &wts, &Count); if (result == 0) { cout << "WTSEnumerateProcessesW Error" << endl; return 1; } cout << "WTSEnumerateProcessesW Success" << endl; for (i; i < Count; i++) { if (lstrcmpiW(wts[i].pProcessName, ProcessName) == 0) { DWORD pid = wts[i].ProcessId; cout << "find pid:" << pid << endl; return pid; break; } } WTSFreeMemory(wts); } #define CONFIG_PATH "config.ini" #define CMDPAGEWIDTH 380 #define STATEPAGEWIDTH 250 GDDCdlg::GDDCdlg(QWidget *parent) : QWidget(parent), ui(new Ui::GDDCdlg) { ui->setupUi(this); initWindow(); initParam(); initSignalSlot(); } GDDCdlg::~GDDCdlg() { // 停止所有通信 stopPushURL(); stopConnectURL1(); stopConnectURL2(); stopConnectSerialCtrl(); stopConnectUDPCtrl(); stopConnectTCPCtrl(); delete m_DlgGDDCSet; delete m_GDDCCmdDlg; delete m_GDDCStateDlg; delete ui; } // 初始化window void GDDCdlg::initWindow() { QPalette palette; // 设置主窗口背景颜色 palette.setColor(QPalette::Window, QColor(50, 50, 50)); this->setPalette(palette); // 嵌入到主窗口 setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); hide(); m_DlgGDDCSet = new GDDCSet(this); m_DlgGDDCSet->setWindowFlags(Qt::Dialog); m_DlgGDDCSet->setWindowModality(Qt::WindowModal); // 设置为模态对话框 m_GDDCCmdDlg = new GDDCCmdDlg(this); m_GDDCStateDlg = new GDDCStateInfo(this); ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); ui->pushButShowCmdPage->setIcon(QIcon(":/res/right.png")); // connect( // ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, // [&](QString message, int type) { // qDebug() << "GDDC receive message:" << message; // g_notifyManager->notify(message, "", type); // }, // Qt::UniqueConnection); connect(ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, &GDDCdlg::showErrorMessage, Qt::UniqueConnection); ui->WgtffmpegVideo->setVedioSaveFileDirPath("./Video"); } // 初始化参数 void GDDCdlg::initParam() { pointSelectionTracking = false; Is_openVideo = false; isCmdPageShow = true; isStatePageShow = false; detectionAreaSetting = false; connectFlag.resize(12, false); _delta = 0; _wheelStopTime = new QTimer(this); _wheelStopTime->setInterval(300); _wheelStopTime->setSingleShot(true); _dragFlag = false; _moveFlag = false; firstLocation = new QLabel(this); firstLocation->setPixmap(QPixmap(":/img/Pod/c.png")); firstLocation->setScaledContents(true); firstLocation->resize(30,30); firstLocation->setStyleSheet("border: none; background: transparent;"); firstLocation->hide(); lastLocation = new QLabel(this); lastLocation->setPixmap(QPixmap(":/img/Pod/circle.png")); lastLocation->setScaledContents(true); lastLocation->resize(25,25); lastLocation->setStyleSheet("border: none; background: transparent;"); lastLocation->hide(); wheelPlus = new QLabel(this); wheelPlus->setPixmap(QPixmap(":/img/Pod/plus.png")); wheelPlus->setScaledContents(true); wheelPlus->resize(30,30); wheelPlus->setStyleSheet("border: none; background: transparent;"); wheelPlus->hide(); wheelSub = new QLabel(this); wheelSub->setPixmap(QPixmap(":/img/Pod/sub.png")); wheelSub->setScaledContents(true); wheelSub->resize(30,30); wheelSub->setStyleSheet("border: none; background: transparent;"); wheelSub->hide(); } // 初始化信号与槽 void GDDCdlg::initSignalSlot() { /*******有四种方式*******/ // 方式一 connect(ui->pushButtonSet, SIGNAL(clicked()), this, SLOT(pushButtonSet_clicked())); // 方式二 // connect(ui->pushButtonSet,&QPushButton::clicked,this,&::GDDCdlg::pushButtonSet_clicked); // 方式三 // connect(ui->pushButtonSet, // QOverload::of(&QPushButton::clicked),this,&::GDDCdlg::pushButtonSet_clicked); // 方式四 // connect(ui->pushButtonSet,&QPushButton::clicked,[=](bool // check){pushButtonSet_clicked();}); connect(ui->pushButShowCmdPage, SIGNAL(clicked()), this, SLOT(pushButShowCmdPage_clicked())); // 控制页面隐藏显示按钮 connect(ui->pushButShowStatePage, SIGNAL(clicked()), this, SLOT(pushButShowStatePage_clicked())); // 状态页面隐藏显示按钮 connect(m_DlgGDDCSet, SIGNAL(SignalStartConnect(int)), this, SLOT(startConnect(int))); // 开始连接 connect(m_DlgGDDCSet, SIGNAL(SignalStopConnect(int)), this, SLOT(stopConnect(int))); // 停止连接 connect(this, &GDDCdlg::wheelSendData, m_GDDCCmdDlg, &GDDCCmdDlg::wheelSwipe); connect(_wheelStopTime, &QTimer::timeout, this, [this](){ emit wheelSendData(0); qDebug()<<"滚轮停止了"; // if(wheelPlus->isVisible()) // { // wheelPlus->hide(); // } // else if(wheelSub->isVisible()) // { // wheelSub->hide(); // } }); } // 槽函数开始连接 void GDDCdlg::startConnect(int type) { switch (type) { case 1: // 播放视频1 stopConnectURL2(); startConnectURL1(); break; case 2: // 播放视频2 stopConnectURL1(); startConnectURL2(); break; case 3: // 串口控制 startConnectSerialCtrl(); break; case 4: // UDP控制 stopConnectTCPCtrl(); startConnectUDPCtrl(); break; case 5: // TCP控制 stopConnectUDPCtrl(); startConnectTCPCtrl(); break; case 6: // 视频(1)推流 startPushURL(); break; default: break; } } // 槽函数停止连接 void GDDCdlg::stopConnect(int type) { switch (type) { case 1: stopConnectURL1(); break; case 2: stopConnectURL2(); break; case 3: stopConnectSerialCtrl(); break; case 4: stopConnectUDPCtrl(); break; case 5: stopConnectTCPCtrl(); break; case 6: stopPushURL(); break; default: break; } } // bool GDDCdlg::eventFilter(QObject *watched, QEvent *event) // { // qDebug() << this->geometry().x(); // qDebug() << this->geometry().y(); // QPoint sPoint2=QCursor::pos(); // qDebug()<<"相对于屏幕坐标2:"<<"("<mapFromGlobal(sPoint2); // qDebug()<<"相对于窗口坐标:"<<"("<type() == QEvent::MouseButtonPress) { // AI检测区域设置 if (m_GDDCCmdDlg->detectionAreaSetting == true) { QPointF sPoint1 = event->globalPosition(); sPoint1 = QCursor::pos(); QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); double a = ui->WgtffmpegVideo->width(); double b = ui->WgtffmpegVideo->height(); double dir = 1920 / a * widgetPoint.rx() - 960; double pitch = -(1080 / b * widgetPoint.ry() - 540); m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), QString::number((int)pitch)); } }*/ if(ui->WgtffmpegVideo->underMouse()) { if(event->button() == Qt::LeftButton) { //记录鼠标按下位置 _dragStartPositon = event->pos(); //QPointF b = event->globalPosition(); qDebug() << "局部坐标" << "x" << _dragStartPositon.x() << "y" << _dragStartPositon.y(); //qDebug() << "全局坐标" << "x" << b.x() << "y" << b.y(); _dragFlag = true; } } } // 鼠标移动 void GDDCdlg::mouseMoveEvent(QMouseEvent *event) { /*if (m_GDDCCmdDlg->detectionAreaSetting == true) { // qDebug() << this->geometry().x(); // qDebug() << this->geometry().y(); QPointF sPoint1 = event->globalPosition(); // qDebug()<<"相对于屏幕坐标1:"<<"("<mapFromGlobal(sPoint2); // qDebug()<<"相对于窗口坐标:"<<"("<WgtffmpegVideo->mapFromGlobal(sPoint1); // qDebug()<<"相对于控件坐标:"<<"("<WgtffmpegVideo->width(); double b = ui->WgtffmpegVideo->height(); double dir = 1920 / a * widgetPoint.rx() - 960; double pitch = -(1080 / b * widgetPoint.ry() - 540); m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), QString::number((int)pitch)); }*/ if(_dragFlag)//点击并且移动 { QPointF diff = event->pos() - _dragStartPositon; qDebug() << "x:" << diff.x() <<"y:" <setMoveParm(diff); if(qAbs(diff.x()) > 5 || qAbs(diff.y()) >5)//像素点超过5ptx才算移动,否则为跟踪 { _moveFlag = true; firstLocation->move((_dragStartPositon - QPoint(firstLocation->width()/2, firstLocation->height()/2)).toPoint()); lastLocation->move(event->pos() - QPoint(lastLocation->width() / 2, lastLocation->height() / 2)); firstLocation->show(); lastLocation->show(); } QPointF widgetPos = mapFromGlobal(event->globalPosition()); //如果移动的时候超过了画面显示区域,则自动退出伺服控制 if(!ui->WgtffmpegVideo->rect().contains(widgetPos.toPoint())) { _moveFlag = false; std::byte buffer[10] = {static_cast(0)}; buffer[5] = (std::byte)0x70; buffer[6] = (std::byte)0x00; buffer[7] = (std::byte)0x00; buffer[8] = (std::byte)0x00; buffer[9] = (std::byte)0x00; // 发送3次 m_GDDCCmdDlg->sendCurDate(buffer, 3); firstLocation->hide(); lastLocation->hide(); } } } void GDDCdlg::mouseReleaseEvent(QMouseEvent *event) { if(ui->WgtffmpegVideo->underMouse()) { if(event->button() == Qt::LeftButton && _moveFlag) { _moveFlag = false; std::byte buffer[10] = {static_cast(0)}; buffer[5] = (std::byte)0x70; buffer[6] = (std::byte)0x00; buffer[7] = (std::byte)0x00; buffer[8] = (std::byte)0x00; buffer[9] = (std::byte)0x00; // 发送3次 m_GDDCCmdDlg->sendCurDate(buffer, 3); firstLocation->hide(); lastLocation->hide(); } else if(event->button() == Qt::LeftButton && _dragFlag) { // 目标跟踪 if (m_GDDCCmdDlg->pointSelectionTracking == true) { QPointF sPoint1 = event->globalPosition(); QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); double a = ui->WgtffmpegVideo->width(); double b = ui->WgtffmpegVideo->height(); double dir = 1920 / a * widgetPoint.rx() - 960; double pitch = -(1080 / b * widgetPoint.ry() - 540); std::byte buffer[10]; buffer[0] = (std::byte)0x3A; buffer[1] = (std::byte)(dir); buffer[2] = (std::byte)((int)dir >> 8); buffer[3] = (std::byte)pitch; buffer[4] = (std::byte)((int)pitch >> 8); buffer[5] = (std::byte)0x00; buffer[6] = (std::byte)0x00; buffer[7] = (std::byte)0x00; buffer[8] = (std::byte)0x00; buffer[9] = (std::byte)0x00; // 发送5次 m_GDDCCmdDlg->sendCurDate(buffer, 3); } } } } // 区域重绘 void GDDCdlg::resizeEvent(QResizeEvent *event) { resizeUI(); // 重新设置布局 } // 重新设置布局 void GDDCdlg::resizeUI() { /* -------------->x * | (0,0) * | * | * | * | * ↓ y */ double GDDCPageHeight = (double)(this->height()); double GDDCPageWidth = (double)(this->width()); // qDebug()<<"宽度,高度:"<setGeometry(GDDCPageWidth - cmdAreaWidth, 0, (int)cmdAreaWidth, GDDCPageHeight); m_GDDCCmdDlg->setTabWidgetGeometry(0, 0, cmdAreaWidth, cmdAreaHeight); /*********状态区位置和大小设置***********/ double stateAreaHeight = 0; double stateAreaWidth = 0; if (isStatePageShow) { stateAreaWidth = STATEPAGEWIDTH; stateAreaHeight = GDDCPageHeight; } m_GDDCStateDlg->setGeometry(0, 0, stateAreaWidth, stateAreaHeight); m_GDDCStateDlg->setTableViewGeometry(0, 0, stateAreaWidth, stateAreaHeight); /*******视频区位置和大小设置********/ double VideoAreaHeight = GDDCPageHeight /*- cmdAreaHeight*/; // 视频区高度 double VideoAreaWidth = GDDCPageWidth - cmdAreaWidth; // 视频区宽度 // //高度值相对比较大 // if(VideoAreaHeight*16>VideoAreaWidth*9) // { // double setVideoAreaWidth = // VideoAreaWidth;//等于吊舱页面宽度-状态区高度 double // setVideoAreaHeight = VideoAreaWidth*9/16; // ui->WgtffmpegVideo->setGeometry(0,0.5*(VideoAreaHeight-setVideoAreaHeight),(int)setVideoAreaWidth,(int)setVideoAreaHeight); // } // //宽度值相对比较大 // else // { // double setVideoAreaHeight = // VideoAreaHeight;//等于吊舱页面高度-控制区高度 double // setVideoAreaWidth = VideoAreaHeight*16/9; // ui->WgtffmpegVideo->setGeometry(0.5*(VideoAreaWidth-setVideoAreaWidth),0,(int)setVideoAreaWidth,(int)setVideoAreaHeight); // } ui->WgtffmpegVideo->setGeometry(0, 0, (int)VideoAreaWidth, (int)VideoAreaHeight); /**************设置按钮****************/ ui->pushButtonSet->setGeometry(GDDCPageWidth - cmdAreaWidth - 30, 0, 30, 30); ui->pushButtonSet->raise(); /**********控制页显示隐藏按钮********/ ui->pushButShowCmdPage->setGeometry(GDDCPageWidth - cmdAreaWidth - 15, GDDCPageHeight * 0.5, 15, 50); ui->pushButShowCmdPage->raise(); /**********状态页显示隐藏按钮********/ ui->pushButShowStatePage->setGeometry(0 + stateAreaWidth, GDDCPageHeight * 0.5, 15, 50); ui->pushButShowStatePage->raise(); } void GDDCdlg::setGlobalSetMap( std::unordered_map &gSetMap) { if (m_DlgGDDCSet) { m_DlgGDDCSet->initPullURL(gSetMap["Pod"].net.remoteIp); } } // 定时器处理 void GDDCdlg::GDDCControlTimeOut() { if (m_GDDCCmdDlg->sendTimes > 0) { // 优先发送次数指令 m_GDDCCmdDlg->sendTimes -= 1; // UDP控制 if (connectFlag[3]) { udpSocket->writeDatagram(m_GDDCCmdDlg->m_DCcmdBuffer, m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); } // TCP控制 // 串口控制 if (m_GDDCCmdDlg->sendTimes == 0) { m_GDDCCmdDlg->clearTJDCCmdBuffer(); } } else { // 发送常发帧或长按指令 m_GDDCCmdDlg->UpdateDataTJDC(); // UDP控制 if (connectFlag[3]) { udpSocket->writeDatagram(m_GDDCCmdDlg->m_DCcmdBuffer, m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); } // TCP控制 // 串口控制 } } // 播放视频1 void GDDCdlg::startConnectURL1() { if (!connectFlag[0]) { connectFlag[0] = true; /* ffmpegvideoDlg版本 ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; // 开始拉流 videoDlg->m_flowType = m_DlgGDDCSet->m_FlowType; videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); videoDlg->setPlayVideo(true); // ui->WgtffmpegVideo->play(m_DlgGDDCSet->m_playURL1); */ VideoWidget *videoWidget = ui->WgtffmpegVideo; if (!videoWidget->play(m_DlgGDDCSet->m_playURL1)) { g_notifyManager->notify("获取视频流失败!", "", 2, 3000); // ui->WgtffmpegVideo->stopPlay(); // m_DlgGDDCSet->setPullBtnText(false); }; } } // 关闭视频1 void GDDCdlg::stopConnectURL1() { if (connectFlag[0]) { connectFlag[0] = false; // ui->WgtffmpegVideo->setPlayVideo(false); ui->WgtffmpegVideo->stopPlay(); } } // 播放视频2 void GDDCdlg::startConnectURL2() { if (!connectFlag[1]) { connectFlag[1] = true; } } // 关闭视频2 void GDDCdlg::stopConnectURL2() { if (connectFlag[1]) { connectFlag[1] = false; } } void GDDCdlg::startConnectSerialCtrl() { if (!connectFlag[2]) { connectFlag[2] = true; } } void GDDCdlg::stopConnectSerialCtrl() { if (connectFlag[2]) { connectFlag[2] = false; } } // 开始UDP控制通信 void GDDCdlg::startConnectUDPCtrl() { if (!connectFlag[3]) { /*启动定时器*/ GDDCControlTimer = new QTimer(); GDDCControlTimer->setInterval(40); connect(GDDCControlTimer, &QTimer::timeout, this, [=]() { GDDCControlTimeOut(); }); GDDCControlTimer->start(); // 创建udp socket对象 udpSocket = new QUdpSocket(this); /*接收*/ // QList ipAddressesList = // QNetworkInterface::allAddresses();//获取本机ip udpSocket->bind(m_DlgGDDCSet->m_myPairNetwork.getLocalPort()); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(UDPMessageReceive())); connectFlag[3] = true; } } // 停止UDP控制通信 void GDDCdlg::stopConnectUDPCtrl() { if (connectFlag[3]) { // 关闭定时器 GDDCControlTimer->stop(); delete GDDCControlTimer; udpSocket->abort(); // 关闭套接字,并丢缓冲区中的所有待处理数据 delete udpSocket; connectFlag[3] = false; } } // 开始TCP控制通信 void GDDCdlg::startConnectTCPCtrl() { if (!connectFlag[4]) { connectFlag[4] = true; } } // 停止TCP控制通信 void GDDCdlg::stopConnectTCPCtrl() { if (connectFlag[4]) { connectFlag[4] = false; } } // 开始视频推流 void GDDCdlg::startPushURL() { if (!connectFlag[5]) { // //方式1:命令行推流 // process = new QProcess(); // connect(process, &QProcess::readyReadStandardOutput, this, [=]() // mutable // { // QString Output = process->readAllStandardOutput(); // qDebug() << "Output:" << Output; // }); // connect(process, &QProcess::readyReadStandardError, this, [=]() // mutable { // QString Error = process->readAllStandardError(); // qDebug() << "Error Output:" << Error; // }); // // process->start("cmd",QStringList()<<"/c"<<"ffmpeg -i // // rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -c copy // -f flv // // rtmp://182.92.130.23/app/test"); // QStringList m_cmd; // QString str; // // str = "ffmpeg -i " + m_DlgGDDCSet->m_playURL1 + " -c copy -f flv " // + // // m_DlgGDDCSet->m_pushURL; // str = "ffmpeg -rtsp_transport tcp -i " + m_DlgGDDCSet->m_playURL1 + " // -c:v libx264 -c:a copy -f flv " + // m_DlgGDDCSet->m_pushURL; // m_cmd << "/c" << str; // process->start("cmd", m_cmd); // //方式2:代码推流 // if(!connectFlag[0]) // { // QMessageBox::information(NULL, tr("提示"), "请先开始连接", // QMessageBox::Ok); m_DlgGDDCSet->setPushStreamText("推送"); // return; // } /* ffmpegvideoDlg版本 ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); videoDlg->setPushStreamIP(m_DlgGDDCSet->m_pushURL); qDebug() << "DLG:" << m_DlgGDDCSet->m_pushURL; videoDlg->setPushStream(true); */ ui->WgtffmpegVideo->setPullURL(m_DlgGDDCSet->m_playURL1); if (!ui->WgtffmpegVideo->pushStream(m_DlgGDDCSet->m_pushURL)) { g_notifyManager->notify("推流失败!", "", 2, 3000); }; m_DlgGDDCSet->setPushStreamText("停止推送"); connectFlag[5] = true; } } // 停止视频推流 void GDDCdlg::stopPushURL() { if (connectFlag[5]) { // //方式1:命令行推流 // if (process != nullptr) { // process->terminate(); // process->close(); // process->kill(); // // 检查进程退出状态 // if (process->exitStatus() == QProcess::CrashExit) { // qDebug() << "Process crashed"; // } else { // qDebug() << "Process exited normally"; // } // delete process; // // 推流进程未自动关闭,手动关闭 // int pids = GetmPid(L"ffmpeg.exe"); // qDebug() << "ffmpeg.exe进程的pid为:" << pids; // if (pids != 0) { // QStringList m_cmd; // m_cmd << "/c" << "taskkill /pid " << QString::number(pids) << " // -f"; QProcess::startDetached("cmd", m_cmd); // } // } // 方式2:代码推流 // ui->WgtffmpegVideo->setPushStream(false); ui->WgtffmpegVideo->stopPushStream(); m_DlgGDDCSet->setPushStreamText("推送"); connectFlag[5] = false; } } // 设置页面弹出 void GDDCdlg::pushButtonSet_clicked() { m_DlgGDDCSet->show(); m_DlgGDDCSet->activateWindow(); // 置为顶层 } // udp数据接收 void GDDCdlg::UDPMessageReceive() { QByteArray data; data.resize(udpSocket->pendingDatagramSize()); QHostAddress addr; quint16 port; udpSocket->readDatagram(data.data(), data.size(), &addr, &port); // 吊舱状态数据更新 m_GDDCStateDlg->UDPMessageReceive(data, data.size()); } // 控制页面隐藏与显示 void GDDCdlg::pushButShowCmdPage_clicked() { if (isCmdPageShow) { m_GDDCCmdDlg->setVisible(false); isCmdPageShow = false; resizeUI(); ui->pushButShowCmdPage->setIcon(QIcon(":/res/left.png")); // ui->pushButton->setGeometry(this->width()/2,this->height()-50,50,50); } else { m_GDDCCmdDlg->setVisible(true); isCmdPageShow = true; resizeUI(); ui->pushButShowCmdPage->setIcon(QIcon(":/res/right.png")); // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); } } // 状态页面隐藏与显示 void GDDCdlg::pushButShowStatePage_clicked() { if (isStatePageShow) { m_GDDCStateDlg->setVisible(false); isStatePageShow = false; resizeUI(); ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); } else { m_GDDCStateDlg->setVisible(true); isStatePageShow = true; resizeUI(); ui->pushButShowStatePage->setIcon(QIcon(":/res/left.png")); // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); } } void GDDCdlg::showErrorMessage(QString message, int type) { g_notifyManager->notify(message, "", type, 3000); } //鼠标滚轮事件 void GDDCdlg::wheelEvent(QWheelEvent *event) { if(ui->WgtffmpegVideo->underMouse()) { // 获取滚轮的滚动方向和角度增量 _delta = event->angleDelta().y(); QPointF currentLocation = event->position(); // qDebug() << "当前位置:" << currentLocation; if (_delta > 0) { // 向上滚动 //qDebug() << "鼠标滚轮向上滚动" << " 步长:" << _delta; // if(wheelSub->isVisible()) // { // wheelSub->hide(); // } // wheelPlus->move((currentLocation - QPoint(wheelPlus->width()/2, wheelPlus->height()/2)).toPoint()); // wheelPlus->show(); emit wheelSendData(_delta); } else if (_delta < 0) { // 向下滚动 // if(wheelPlus->isVisible()) // { // wheelPlus->hide(); // } // wheelSub->move((currentLocation - QPoint(wheelSub->width()/2, wheelSub->height()/2)).toPoint()); // wheelSub->show(); emit wheelSendData(_delta); //qDebug() << "鼠标滚轮事向下滚动" << " 步长:" << _delta; } if(!_wheelStopTime->isActive()) { _wheelStopTime->start(); } else { _wheelStopTime->stop(); _wheelStopTime->start(); } } QWidget::wheelEvent(event); }