#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 秒
|
}
|