310 lines
8.8 KiB
C++
310 lines
8.8 KiB
C++
#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();
|
||
}
|
||
|
||
|