HX_CameraLoopPlay/HX_CameraLoopPlay/CameraLoopPlay.cpp

310 lines
8.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "CameraLoopPlay.h"
#include "ui_CameraLoopPlay.h"
#include "ui_SingleCameraWidget.h"
#include <QTimer>
#include <QDateTime>
#include <qgroupbox>
#include <QStandardItemModel>
#include <QFile>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QMouseEvent>
// 相机列表JSON文件名称
const QString CameraJsonFileName = "camera.json";
CameraLoopPlay::CameraLoopPlay(QWidget* parent)
: QMainWindow(parent), ui(new Ui::CameraLoopPlayClass)
{
ui->setupUi(this);
// 隐藏菜单栏
setWindowFlag(Qt::FramelessWindowHint);
setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint);
qRegisterMetaType<HWND>("HWND");
m_cameraLoopThread = new QThread(this);
m_cameraThread = new CameraThread();
m_cameraThread->moveToThread(m_cameraLoopThread);
connect(m_cameraLoopThread, &QThread::started, m_cameraThread, &CameraThread::run);
connect(m_cameraLoopThread, &QThread::finished, m_cameraThread, &CameraThread::stop);
connect(this, &CameraLoopPlay::loginSignal, m_cameraThread, &CameraThread::login);
connect(this, &CameraLoopPlay::realPlaySignal, m_cameraThread, &CameraThread::realPlay);
connect(this, &CameraLoopPlay::stopReadPlaySignal, m_cameraThread, &CameraThread::stopRealPlay);
connect(m_cameraThread, &CameraThread::loginResultSignal, this, &CameraLoopPlay::loginResult);
m_cameraLoopThread->start();
calendarTimerUpdater();
connect(ui->comboBox_windowNumber, SIGNAL(currentIndexChanged(int)), this, SLOT(changeWindowNumber(int)));
initTreeViewCameraList();
initCameraFarmes();
}
CameraLoopPlay::~CameraLoopPlay()
{
// 关闭并等待视频轮播线程完成
if (m_cameraThread && m_cameraLoopThread->isRunning()) {
m_cameraLoopThread->quit();
m_cameraLoopThread->wait();
}
delete m_cameraLoopThread;
delete m_cameraThread;
delete ui;
}
bool CameraLoopPlay::eventFilter(QObject* watched, QEvent* event)
{
// 处理鼠标按下、释放和移动事件
if (watched == ui->widget_title) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->type() == QEvent::MouseButtonPress) {
if (mouseEvent->button() == Qt::LeftButton) {
m_mousePressed = true; // 启动拖拽
m_mousePoint = mouseEvent->globalPos() - this->pos();
this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint | Qt::Window | Qt::WindowStaysOnTopHint);
this->show(); // 确保窗口显示
return true;
}
}
else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
m_mousePressed = false;
return true;
}
else if (mouseEvent->type() == QEvent::MouseMove) {
if (m_mousePressed && (mouseEvent->buttons() & Qt::LeftButton)) {
this->move(mouseEvent->globalPos() - m_mousePoint);
// 每次移动时设置为最上方
this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint | Qt::Window | Qt::WindowStaysOnTopHint);
this->show();
return true;
}
}
}
return QWidget::eventFilter(watched, event);
}
void CameraLoopPlay::on_pushButton_min_clicked()
{
this->showMinimized();
}
void CameraLoopPlay::on_pushButton_slide_clicked()
{
if (m_unfold) {
ui->widget_left->hide();
ui->pushButton_slide->setStyleSheet("border-image: url(:/CameraLoopPlay/Resource/image/unfold.png);");
m_unfold = false;
}
else {
ui->widget_left->show();
ui->pushButton_slide->setStyleSheet("border-image: url(:/CameraLoopPlay/Resource/image/fold.png);");
m_unfold = true;
}
}
void CameraLoopPlay::on_pushButton_loopPlay_clicked()
{
if (ui->pushButton_loopPlay->text() == QStringLiteral("开启轮播")) {
ui->pushButton_loopPlay->setText(QStringLiteral("关闭轮播"));
// 开启轮播
startLoopPlay();
}
else {
ui->pushButton_loopPlay->setText(QStringLiteral("开启轮播"));
// 关闭轮播
stopLoopPlay();
}
}
void CameraLoopPlay::changeWindowNumber(int index)
{
if (index == 0) {
addCameraWidgetToCameraFarmes(1, 1);
}
else if (index == 1) {
addCameraWidgetToCameraFarmes(2, 2);
}
else if (index == 2) {
addCameraWidgetToCameraFarmes(3, 3);
}
else if (index == 3) {
addCameraWidgetToCameraFarmes(4, 4);
}
else if (index == 4) {
addCameraWidgetToCameraFarmes(4, 5);
}
else if (index == 5) {
addCameraWidgetToCameraFarmes(6, 6);
}
}
void CameraLoopPlay::loginResult(int a, int b)
{
if (a >= 0) {
m_treeCameraItemList[b]->setIcon(
QIcon(":/CameraLoopPlay/Resource/image/online.png"));
}
}
void CameraLoopPlay::addCameraWidgetToCameraFarmes(int rows, int cols)
{
// 清除已有的布局项
QLayoutItem* item;
while ((item = ui->gridLayout_cameraFarmes->takeAt(0)) != nullptr) {
delete item->widget();
delete item;
}
// 停止摄像头播放
stopVideoStreamPlay();
m_singleCameraWidgetList.clear();
//m_lastFocusSignalCameraWidget = nullptr;
// 遍历行和列添加widget到gridLayout中
for (int row = 0; row < rows; ++row) {
for (int col = 0; col < cols; ++col) {
int index = (row * cols + col);
QWidget* cameraWidgetContainer = new QWidget;
Ui::SingleCameraWidget* signalCameraWidget = new Ui::SingleCameraWidget;
signalCameraWidget->setupUi(cameraWidgetContainer);
signalCameraWidget->label_cameraNumber->hide();
if (m_cameraDeviceInfoList.count() > index) {
signalCameraWidget->widget_camera->setCameraName( m_cameraDeviceInfoList[index].getName());
signalCameraWidget->widget_camera->setCameraWidgetWidth( signalCameraWidget->widget_camera->width());
signalCameraWidget->label_cameraNumber->setText( m_cameraDeviceInfoList[index].getName());
emit realPlaySignal((HWND)signalCameraWidget->label_camera->winId(), index);
signalCameraWidget->label_camera->raise();
}
else {
signalCameraWidget->widget_camera->setCameraName(QStringLiteral("无视频%1").arg(index));
}
signalCameraWidget->label_camera->installEventFilter(this);
signalCameraWidget->label_camera->setFocusPolicy(Qt::StrongFocus);
m_singleCameraWidgetList.append(signalCameraWidget);
ui->gridLayout_cameraFarmes->addWidget(cameraWidgetContainer, row, col);
}
}
}
void CameraLoopPlay::calendarTimerUpdater()
{
QTimer* timer_calendar = new QTimer(this);
connect(timer_calendar, &QTimer::timeout, this, [this]() {
QDateTime time = QDateTime::currentDateTime();
QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
ui->label_clander->setText(str);
});
timer_calendar->start(1000); //每一秒溢出一次进入槽函数
}
void CameraLoopPlay::startLoopPlay()
{
}
void CameraLoopPlay::stopLoopPlay()
{
}
void CameraLoopPlay::initTreeViewCameraList()
{
ui->treeView_cameraList->setHeaderHidden(true);
ui->treeView_cameraList->setEditTriggers(QAbstractItemView::NoEditTriggers);
readCameraJsonInfo();
}
void CameraLoopPlay::readCameraJsonInfo()
{
QFile file(QCoreApplication::applicationDirPath() + "/" + CameraJsonFileName);
if (file.open(QIODevice::ReadOnly)) {
QByteArray jsonData = file.readAll();
file.close();
int indexValue = 0;
QStandardItemModel* standardItemModel = new QStandardItemModel(this);
QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonData));
QJsonObject jsonObject = jsonDoc.object();
for (auto it = jsonObject.constBegin(); it != jsonObject.constEnd(); ++it) {
QJsonArray jsonArray = it.value().toArray();
QStandardItem* rootItem = new QStandardItem(it.key());
rootItem->setIcon(QIcon(":/CameraLoopPlay/Resource/image/camera.png"));
for (QJsonValue deviceInfo : jsonArray) {
QString cameraDeviceName = deviceInfo["Name"].toString(); // 摄像头名称
QString cameraDeviceIP = deviceInfo["IP"].toString();
QString cameraDeviceUserName = deviceInfo["UserName"].toString();
QString cameraDevicePassWord = deviceInfo["PassWord"].toString();
CameraDeviceInfo cameraDeviceInfo(indexValue, cameraDeviceName, cameraDeviceIP, cameraDeviceUserName, cameraDevicePassWord);
// 登录摄像头
emit loginSignal(cameraDeviceIP, cameraDeviceUserName, cameraDevicePassWord, indexValue, cameraDeviceName);
indexValue++;
// 加入至摄像头列表树
QStandardItem* subItem = new QStandardItem(cameraDeviceName);
subItem->setIcon(QIcon(":/CameraLoopPlay/Resource/image/offline.png"));
rootItem->appendRow(subItem);
m_treeCameraItemList.append(subItem);
m_cameraDeviceInfoList.append(cameraDeviceInfo);
}
standardItemModel->appendRow(rootItem);
}
ui->treeView_cameraList->setModel(standardItemModel);
ui->treeView_cameraList->expandAll();
}
}
void CameraLoopPlay::initCameraFarmes()
{
ui->comboBox_windowNumber->setCurrentIndex(4);
//addCameraWidgetToCameraFarmes(4, 5);
}
void CameraLoopPlay::stopVideoStreamPlay()
{
if (m_cameraDeviceInfoList.isEmpty())
return;
for (int i = 0; i < m_cameraDeviceInfoList.size(); i++) {
int cameraIndex = m_cameraDeviceInfoList.at(i).getTreeindex();
emit stopReadPlaySignal(cameraIndex-1);
}
}
void CameraLoopPlay::on_pushButton_close_clicked()
{
this->close();
}