h1544216712
2025-02-21 c54475f3335a28b7a2acff9a2f9d63a461ce215a
Client/¶­Åìèº/code/facexmainwindow.cpp
New file
@@ -0,0 +1,241 @@
#include "facexmainwindow.h"
#include "ui_facexmainwindow.h"
#include <QMessageBox>
#include <QStringList>
#include <QFileDialog>
#include <QGuiApplication>
#include <QScreen>
#include <QException>
#include <QThread>
#include <QWheelEvent>
FaceXMainWindow::FaceXMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::FaceXMainWindow),
    m_player(new QMediaPlayer),
    m_playerlist(new QMediaPlaylist),
    m_videowidget(new QVideoWidget(this)),
    m_ffmpeg(new QFFmpeg(this)),
    m_rtspThread(nullptr)
{
    ui->setupUi(this);
    //设置可移动区域
    dragArea = QRect(0, 0, width(), 40);
    setWindowFlags(Qt::FramelessWindowHint);//隐藏边框
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    // è®¾ç½®æ’­æ”¾æŒ‰é’®å›¾æ ‡ä¸ºæ’­æ”¾å›¾æ ‡
    ui->btn_play->setStyleSheet("border-image: url(:/image/start.png)");
    //设置播放器播放队列
    m_player->setPlaylist(m_playerlist);
    //设置播放器显示窗口
    m_player->setVideoOutput(m_videowidget);
    // è®¾ç½®æ’­æ”¾å™¨æ˜¾ç¤ºçª—口
    m_videowidget->resize(ui->label_video->size());
    m_videowidget->move(ui->label_video->pos());
    m_videowidget->show();
    ui->label_video->hide();
    // è¿žæŽ¥ QFFmpeg çš„信号
    connect(m_ffmpeg, &QFFmpeg::GetImage, this, &FaceXMainWindow::SetImage, Qt::QueuedConnection);
    // è¿žæŽ¥æ’­æ”¾å™¨çš„错误信号
    connect(m_player, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), this, [this](QMediaPlayer::Error error) {
        QMessageBox::critical(this, "播放错误", m_player->errorString());
    });
    // è¿žæŽ¥æ’­æ”¾å™¨çš„位置更新信号
    connect(m_player, &QMediaPlayer::positionChanged, this, &FaceXMainWindow::updateSliderPosition);
    connect(ui->horizontalSlider, &QSlider::sliderMoved, this, &FaceXMainWindow::on_sliderPosition_valueChanged);
}
FaceXMainWindow::~FaceXMainWindow()
{
    if (m_rtspThread && m_rtspThread->isRunning()) {
        m_rtspThread->quit();
        m_rtspThread->wait();
    }
    delete ui;
}
void FaceXMainWindow::mousePressEvent(QMouseEvent *event)
{
    if (dragArea.contains(event->pos())) {
        offset = event->globalPos() - pos();
        isDragging = true;
    }
}
void FaceXMainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (isDragging && dragArea.contains(event->pos())) {
        move(event->globalPos() - offset);
    }
}
void FaceXMainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    isDragging = false;
}
//查询按钮
void FaceXMainWindow::on_btnSelect_clicked()
{
    QDate dateStart = ui->dateStart->date();
    QDate dateEnd = ui->dateEnd->date();
    if (dateStart > dateEnd) {
        QMessageBox::critical(nullptr, "错误", "开始时间不能大于结束时间!");
        return;
    }
    //将日期转换为日期时间计算相差的天数,超过60天则提示不用继续
    QDateTime dateTimeStart = ui->dateStart->dateTime();
    QDateTime dateTimeEnd = ui->dateEnd->dateTime();
    if (dateTimeStart.daysTo(dateTimeEnd) >= 60) {
        QMessageBox::critical(nullptr, "错误", "每次最大只能查询60天内!");
        return;
    }
    QStringList fileNames = QFileDialog::getOpenFileNames(this, "选择文件", "D:/", "视频文件 (*.mp4 *.avi *.mov);;所有文件 (*.*)");
    if (!fileNames.isEmpty()) {
        m_playerlist->clear();
        m_ffmpeg->SetUrl(fileNames.first());
        if (m_ffmpeg->Init()) {
            if (m_rtspThread && m_rtspThread->isRunning()) {
                m_rtspThread->quit();
                m_rtspThread->wait();
            }
            m_rtspThread = new RtspThread(m_ffmpeg, this);
            m_rtspThread->start();
        }
        QMessageBox::information(this, "成功", "文件已添加到播放列表");
    } else {
        QMessageBox::information(this, "提示", "未选择任何文件");
    }
}
//隐藏窗口按钮
void FaceXMainWindow::on_toolButton_clicked()
{
    hide();
}
//最小化按钮
void FaceXMainWindow::on_toolButton_3_clicked()
{
    showMinimized();
}
//最大化按钮
void FaceXMainWindow::on_toolButton_2_clicked()
{
    if(windowState() != Qt::WindowMaximized)
    {
        this->showMaximized();
    }
    else
    {
        this->showNormal();
    }
}
//鼠标双击最大化
void FaceXMainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(windowState() != Qt::WindowMaximized)
    {
        this->showMaximized();
    }
    else
    {
        this->showNormal();
    }
}
void FaceXMainWindow::setPlayButtonIcon(bool isPlaying)
{
    if (isPlaying) {
        ui->btn_play->setStyleSheet("border-image: url(:/image/pause.png)");
    } else {
        ui->btn_play->setStyleSheet("border-image: url(:/image/start.png)");
    }
}
void FaceXMainWindow::playOrPause()
{
    isPlaying = !isPlaying;
    if (isPlaying) {
        m_player->play();
        ui->btn_play->setStyleSheet("border-image: url(:/image/pause.png)");
    } else {
        m_player->pause();
        ui->btn_play->setStyleSheet("border-image: url(:/image/start.png)");
    }
}
//播放按钮
void FaceXMainWindow::on_btn_play_clicked()
{
    if (m_ffmpeg) {
        if (!m_rtspThread || !m_rtspThread->isRunning()) {
            if (m_ffmpeg->Init()) {
                m_rtspThread = new RtspThread(m_ffmpeg, this);
                m_rtspThread->start();
            }
        }
        playOrPause();
    } else {
        QMessageBox::critical(this, "错误", "播放器未初始化");
    }
}
//截图按钮
void FaceXMainWindow::on_btn_cut_clicked()
{
    QScreen *screen = QGuiApplication::primaryScreen();
    if (screen) {
        QPixmap screenshot = screen->grabWindow(this->winId());
        screenshot.save("screenshot.png");
        QMessageBox::information(this, "提示", "截图已保存为 screenshot.png");
    }
}
void FaceXMainWindow::SetImage(const QImage &image)
{
    if (!image.isNull()) {
        ui->label_video->setScaledContents(true); // è®¾ç½®å›¾åƒè‡ªåŠ¨ç¼©æ”¾
        ui->label_video->setPixmap(QPixmap::fromImage(image));
        ui->label_video->adjustSize();
        ui->label_video->update();
    } else {
        qDebug() << "接收到的图像为空";
    }
}
//更新滑块的位置
void FaceXMainWindow::updateSliderPosition()
{
    ui->horizontalSlider->setValue(m_player->position());
}
//拖动滑块来控制播放进度
void FaceXMainWindow::on_sliderPosition_valueChanged(int value)
{
    m_player->setPosition(value);
}
void FaceXMainWindow::on_btn_back_clicked()
{
    int currentPosition = m_player->position();
    m_player->setPosition(currentPosition - 10000); // åŽé€€ 10 ç§’
}
void FaceXMainWindow::on_btn_forward_clicked()
{
    int currentPosition = m_player->position();
    m_player->setPosition(currentPosition + 10000); // å‰è¿› 10 ç§’
}