#include "mainwindow.h" // #include #include #include #include #include #include #include "ui_mainwindow.h" #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #else #include #endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // this->setWindowTitle("载荷视频播放软件"); installWindowAgent(); loadStyleSheet(Dark); // apply the qss QFile qssfile(":/Qss/qss.qss"); if (qssfile.open(QFile::ReadOnly)) { QString style = QLatin1String(qssfile.readAll()); qApp->setStyleSheet(style); qssfile.close(); } else { qDebug() << "Open file fail " << Qt::endl; } // QList list; // list.append("rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid"); // list.append("rtsp://182.92.130.23/nmyj/video"); // list.append("rtmp://182.92.130.23/nmyj/video"); // list.append("rtmp://ns8.indexforce.com/home/mystream"); // // ui->videoWidget->udpPlay("172.10.1.199", 13001); // ui->videoWidget->setVedioSaveFileDirPath("./video"); // ui->videoWidget->play(list.at(1)); // ui->videoWidget->pushStream("udp://172.10.1.199:8009"); QString urlFile = "networkSettingInfo.ini"; QFile file(urlFile); if (!file.exists()) { file.open(QIODevice::WriteOnly); file.close(); } g_networkSettingInfo = new QSettings("networkSettingInfo.ini", QSettings::IniFormat); initSignalConnection(); initNotifyManager(); initNotifyMessageConnection(); initChangeVideoLayoutConnection(); initHideButton(); setSavedVideoDir(); QApplication::instance()->installEventFilter(this); // setFocusPolicy( Qt::StrongFocus ); // 窗口将通过鼠标点击、按tab键等方式获取焦点 // ui->stackedWidget->setCurrentIndex(1); // ui->videoWidget1->play(list.at(0)); // ui->videoWidget2->play(list.at(0)); // ui->videoWidget3->play(list.at(0)); // ui->videoWidget4->play(list.at(0)); } MainWindow::~MainWindow() { QProcess m_process; m_process.setWorkingDirectory(QCoreApplication::applicationDirPath()+"/nginx"); m_process.start("cmd.exe",QStringList()<<"/c"<<"nginx -s stop"); m_process.waitForFinished(); delete ui; } bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) { #ifdef Q_OS_WIN MSG *msg = (MSG *)message; if (msg->message == WM_SYSCOMMAND) { if (61587 == msg->wParam) { // 单击事件 return true; } if (61539 == msg->wParam) { // 双击事件 return true; } } #endif return QMainWindow::nativeEvent(eventType, message, result); } void MainWindow::paintEvent(QPaintEvent *ev) { int offset = 0; if (ui->commandWidget->isHidden()) { offset = hideCommandWidgetBtn->width() / 2; } hideCommandWidgetBtn->move(ui->stackedWidget->width() - offset, ui->commandWidget->height() / 2); } void MainWindow::closeEvent(QCloseEvent *event) { if (m_mapWidget) { m_mapWidget->close(); delete m_mapWidget; } if(m_dataServer){ m_dataServer->close(); delete m_dataServer; } // QMainWindow::close(); } void MainWindow::initSignalConnection() { connect(ui->videoControlWidget, &VideoControl::startConnectionSignal, ui->videoWidget, &VideoWidget::udpPlay, Qt::UniqueConnection); connect(ui->videoControlWidget, &VideoControl::stopConnectionSignal, ui->videoWidget, &VideoWidget::stopPlay, Qt::UniqueConnection); connect(&streamAddrSettingsDlg, &StreamAddrSettingsDlg::startPullStreamSignal, this, &MainWindow::pullStreamSlot); connect(&streamAddrSettingsDlg, &StreamAddrSettingsDlg::startPushStreamSignal, this, &MainWindow::pushStreamSlot); connect(ui->videoControlWidget, &VideoControl::stopVideoSignal, this, &MainWindow::closeVideoSlot); } void MainWindow::initNotifyMessageConnection() { connect(this, &MainWindow::sendErrorMessage, this, &MainWindow::showMessageSlots); connect(ui->videoWidget, &VideoWidget::sendErrorMessageSignal, this, &MainWindow::showMessageSlots); connect(ui->commandWidget, &CommandWidget::sendErrorMessage, this, &MainWindow::showMessageSlots); } void MainWindow::initChangeVideoLayoutConnection() { connect(ui->videoControlWidget, &VideoControl::changeVideoLayout, this, [=](int index) { ui->stackedWidget->setCurrentIndex(index); }); } void MainWindow::initNotifyManager() { m_notifyManager = new NotifyManager(this, this); m_notifyManager->setMaxCount(5); m_notifyManager->setDisplayTime(2000); m_notifyManager->setNotifyWndSize(400, 60); } void MainWindow::showMessageSlots(QString message, int type) { if (m_notifyManager) { m_notifyManager->notify(message, "", type, 3000); } } void MainWindow::installWindowAgent() { // 1. Setup window agent windowAgent = new QWK::WidgetWindowAgent(this); windowAgent->setup(this); auto menuBar = new QMenuBar(this); // QMenu *settingmenu = // menuBar->addMenu(QIcon(":/images/settings1.png"), "设置"); QAction *settingAction = new QAction(this); settingAction->setIcon(QIcon(":/images/settings1.png")); settingAction->setIconText("设置"); menuBar->addAction(settingAction); connect(settingAction, &QAction::triggered, this, &MainWindow::showSettingDlgSlot); QAction *playBackAction = new QAction(this); playBackAction->setIcon(QIcon(":/images/playback.png")); playBackAction->setIconText("回放"); menuBar->addAction(playBackAction); connect(playBackAction, &QAction::triggered, this, &MainWindow::openSavedVideoDirSlot); QAction *pushStreamAction = new QAction(this); pushStreamAction->setIcon(QIcon(":/images/pushstream.png")); pushStreamAction->setIconText("推流"); menuBar->addAction(pushStreamAction); connect(pushStreamAction, &QAction::triggered, this, &MainWindow::showStreamSettingsDlgSlot); QAction *showMap3DAction = new QAction(this); showMap3DAction->setIcon(QIcon(":/images/map3D.png")); showMap3DAction->setIconText("推流"); menuBar->addAction(showMap3DAction); connect(showMap3DAction, &QAction::triggered, this, &MainWindow::showMap3DSlot); menuBar->setObjectName(QStringLiteral("win-menu-bar")); auto titleLabel = new QLabel(); titleLabel->setAlignment(Qt::AlignCenter); titleLabel->setObjectName(QStringLiteral("win-title-label")); #ifndef Q_OS_MAC auto iconButton = new QWK::WindowButton(); iconButton->setEnabled(false); iconButton->setObjectName(QStringLiteral("icon-button")); iconButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); auto pinButton = new QWK::WindowButton(); pinButton->setCheckable(true); pinButton->setObjectName(QStringLiteral("pin-button")); pinButton->setProperty("system-button", true); pinButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); auto minButton = new QWK::WindowButton(); minButton->setObjectName(QStringLiteral("min-button")); minButton->setProperty("system-button", true); minButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); auto maxButton = new QWK::WindowButton(); maxButton->setCheckable(true); maxButton->setObjectName(QStringLiteral("max-button")); maxButton->setProperty("system-button", true); maxButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); auto closeButton = new QWK::WindowButton(); closeButton->setObjectName(QStringLiteral("close-button")); closeButton->setProperty("system-button", true); closeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); #endif auto windowBar = new QWK::WindowBar(); #ifndef Q_OS_MAC windowBar->setIconButton(iconButton); windowBar->setPinButton(pinButton); windowBar->setMinButton(minButton); windowBar->setMaxButton(maxButton); windowBar->setCloseButton(closeButton); #endif windowBar->setMenuBar(menuBar); windowBar->setTitleLabel(titleLabel); windowBar->setHostWidget(this); windowAgent->setTitleBar(windowBar); #ifndef Q_OS_MAC windowAgent->setHitTestVisible(pinButton, true); windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton); windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton); windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton); windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton); #endif windowAgent->setHitTestVisible(menuBar, true); #ifdef Q_OS_MAC windowAgent->setSystemButtonAreaCallback([](const QSize &size) { static constexpr const int width = 75; return QRect(QPoint(size.width() - width, 0), QSize(width, size.height())); // }); #endif setMenuWidget(windowBar); #ifndef Q_OS_MAC connect(windowBar, &QWK::WindowBar::pinRequested, this, [this, pinButton](bool pin) { if (isHidden() || isMinimized() || isMaximized() || isFullScreen()) { return; } setWindowFlag(Qt::WindowStaysOnTopHint, pin); show(); pinButton->setChecked(pin); }); connect(windowBar, &QWK::WindowBar::minimizeRequested, this, &QWidget::showMinimized); connect(windowBar, &QWK::WindowBar::maximizeRequested, this, [this, maxButton](bool max) { if (max) { showMaximized(); } else { showNormal(); } // It's a Qt issue that if a QAbstractButton::clicked triggers a // window's maximization, the button remains to be hovered until // the mouse move. As a result, we need to manually send leave // events to the button. // emulateLeaveEvent(maxButton); }); connect(windowBar, &QWK::WindowBar::closeRequested, this, &QWidget::close); #endif } void MainWindow::loadStyleSheet(Theme theme) { if (!styleSheet().isEmpty() && theme == currentTheme) return; currentTheme = theme; if (QFile qss(theme == Dark ? QStringLiteral(":/Qss/dark-style.qss") : QStringLiteral(":/Qss/light-style.qss")); qss.open(QIODevice::ReadOnly | QIODevice::Text)) { setStyleSheet(QString::fromUtf8(qss.readAll())); Q_EMIT themeChanged(); } } void MainWindow::setSavedVideoDir() { ui->videoWidget->setVedioSaveFileDirPath("./video/main"); ui->videoWidget1->setVedioSaveFileDirPath("./video/video1"); ui->videoWidget2->setVedioSaveFileDirPath("./video/video2"); ui->videoWidget3->setVedioSaveFileDirPath("./video/video3"); ui->videoWidget4->setVedioSaveFileDirPath("./video/video4"); } void MainWindow::initHideButton() { hideCommandWidgetBtn = new QToolButton(this); hideCommandWidgetBtn->setIcon(QIcon(":/images/right.png")); hideCommandWidgetBtn->setIconSize(QSize(24, 24)); hideCommandWidgetBtn->setFixedSize(30, 30); connect(hideCommandWidgetBtn, &QToolButton::clicked, this, &MainWindow::hideCommandWidgetSlot); } void MainWindow::showSettingDlgSlot() { settingDlg.exec(); } void MainWindow::showStreamSettingsDlgSlot() { streamAddrSettingsDlg.exec(); } void MainWindow::hideCommandWidgetSlot() { if (ui->commandWidget->isHidden()) { ui->commandWidget->show(); hideCommandWidgetBtn->setIcon(QIcon(":/images/right.png")); } else { ui->commandWidget->hide(); hideCommandWidgetBtn->setIcon(QIcon(":/images/left.png")); } } void MainWindow::openSavedVideoDirSlot() { // QDesktopServices::openUrl( // QUrl(QApplication::applicationDirPath() + "/video")); // QFileDialog::Options options = QFileDialog::DontUseNativeDialog; QString videoDirPath = QApplication::applicationDirPath() + "/video/"; QString filePath = QFileDialog::getOpenFileName( this, "选择文件", videoDirPath, "*.ts", nullptr); if (!filePath.isEmpty()) { QString fileName = filePath; qDebug() << fileName; if (ui->videoWidget->play(filePath, false)) { int duration = ui->videoWidget->getVideoDuration(); if (duration > 0) { ui->videoControlWidget->updateVideoDuration(duration); connect(ui->videoWidget, &VideoWidget::updateVideoCurrentTimeSignal, this, [=](int currentTime, int duration) { ui->videoControlWidget->updateVideoSlider( currentTime, duration); }); connect(ui->videoControlWidget, &VideoControl::seekToVideoSignal, ui->videoWidget, &VideoWidget::seekToVideo, Qt::UniqueConnection); connect(ui->videoControlWidget, &VideoControl::changePlaySpeedSignal, ui->videoWidget, &VideoWidget::setPlaySpeed, Qt::UniqueConnection); } } } } // 拉流 void MainWindow::pullStreamSlot(bool bPull) { if (!g_networkSettingInfo) return; if (bPull) { // QString podPullStreamIP = // g_networkSettingInfo->value("NetworkStreamSettings/podPullAddress") // .toString(); // QString pullStreamIP1 = // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress1") // .toString(); // QString pullStreamIP2 = // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress2") // .toString(); // QString pullStreamIP3 = // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress3") // .toString(); // QString pullStreamIP4 = // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress4") // .toString(); if (!ui->videoWidget->getPlayStatus()) { ui->videoWidget->play(g_pullStreamInfoStruct.podPullIP); } else { emit sendErrorMessage("吊舱视频正在播放,请先暂停!", NotifyType::WARNING); } if (!ui->videoWidget1->getPlayStatus()) { ui->videoWidget1->play(g_pullStreamInfoStruct.pullIP1); } else { emit sendErrorMessage("备用视频1正在播放,请先暂停!", NotifyType::WARNING); } if (!ui->videoWidget2->getPlayStatus()) { ui->videoWidget2->play(g_pullStreamInfoStruct.pullIP2); } else { emit sendErrorMessage("备用视频2正在播放,请先暂停!", NotifyType::WARNING); } if (!ui->videoWidget3->getPlayStatus()) { ui->videoWidget3->play(g_pullStreamInfoStruct.pullIP3); } else { emit sendErrorMessage("备用视频3正在播放,请先暂停!", NotifyType::WARNING); } if (!ui->videoWidget4->getPlayStatus()) { ui->videoWidget4->play(g_pullStreamInfoStruct.pullIP4); } else { emit sendErrorMessage("备用视频4正在播放,请先暂停!", NotifyType::WARNING); } } else { ui->videoWidget->stopPlay(); ui->videoWidget1->stopPlay(); ui->videoWidget2->stopPlay(); ui->videoWidget3->stopPlay(); ui->videoWidget4->stopPlay(); } } // 推流 void MainWindow::pushStreamSlot(bool bPush) { if (!g_networkSettingInfo) return; if (bPush) { // int uavType = // g_networkSettingInfo->value("NetworkStreamSettings/uavType") // .toInt(); // int uavID = // g_networkSettingInfo->value("NetworkStreamSettings/uavID").toInt(); // int pushStreamIndex = // g_networkSettingInfo->value("NetworkStreamSettings/pushStreamType") // .toInt(); // if (2 == pushStreamIndex) { // QString pushStreamIP = // g_networkSettingInfo // ->value("NetworkStreamSettings/pushStreamAddress") // .toString(); // } int pushStreamType = g_pushStreamInfoStruct.pushType; QString pushStreamIP; if (pushStreamType == 0) { // 公司服务器 pushStreamIP = generatePushURL2(g_pushStreamInfoStruct.uavID, g_pushStreamInfoStruct.uavType); qDebug() << pushStreamIP; } else if (pushStreamType == 1) { // 阿里云服务器 pushStreamIP = generatePushURL(g_pushStreamInfoStruct.uavID, g_pushStreamInfoStruct.uavType); qDebug() << pushStreamIP; } else { pushStreamIP = g_pushStreamInfoStruct.pushStreamIP; } ui->videoWidget->pushStream(pushStreamIP); } else { ui->videoWidget->stopPushStream(); // ui->videoWidget1->stopPushStream(); // ui->videoWidget2->stopPushStream(); // ui->videoWidget3->stopPushStream(); // ui->videoWidget4->stopPushStream(); } } void MainWindow::closeVideoSlot() { ui->videoWidget->stopPlay(); ui->videoWidget1->stopPlay(); ui->videoWidget2->stopPlay(); ui->videoWidget3->stopPlay(); ui->videoWidget4->stopPlay(); ui->videoControlWidget->resetVideoSlider(); emit sendErrorMessage("视频流已关闭!", NotifyType::SUCCESS); } void MainWindow::showMap3DSlot() { if(m_dataServer == nullptr){ m_dataServer = new DataServerforMap(); m_dataServer->startServe(); } if (m_mapWidget == nullptr) { m_mapWidget = new WebMapWidget(); m_mapWidget->load(QUrl("http://127.0.0.1:80")); m_mapWidget->resize(1920,1080); } if (!m_mapWidget->isVisible()) { m_mapWidget->show(); } } bool MainWindow::eventFilter(QObject* watched, QEvent* event){ if (event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast(event); // 判断是否同时按下ctrl和c键 if( (keyEvent->modifiers()&Qt::ControlModifier) != 0 && keyEvent->key()==Qt::Key_S) { //显示网络配置窗口 if(m_dataServer!=nullptr && !m_dataServer->isVisible()){ m_dataServer->show(); } } } return QWidget::eventFilter(watched, event); }