Files
chenzhen 222dda1e43 1,新增“App_ThermalImageSystem”;
2,新增“Apps”;
3,新增“Common”;
4,新增“FileList”;
5,新增“MediaX”;
6,新增“OpenSource”;
7,新增“Samples”;
8,新增“SoftwareBusinessLines”.
2026-02-14 23:03:23 +08:00

176 lines
4.4 KiB
C++

#include "GLWidget.h"
#include <QMouseEvent>
#include <QDebug>
#include <QTimer>
#include <QMouseEvent>
#define StatusBackImgShowInterval 1000 //毫秒
#define RealImgShowInterval 5 // 毫秒
GLWidget::GLWidget(QWidget* parent)
: QOpenGLWidget(parent), texture(nullptr)
{
m_bIsOpenGLInit = false;
m_bStartNewImg = false;
SetStatusBackImg(Normal);
connect(&m_varTimer, &QTimer::timeout, this, &GLWidget::OnTimer_UpdataVideoView);
m_varTimer.setTimerType(Qt::PreciseTimer);
m_varTimer.start(StatusBackImgShowInterval);
this->setVisible(true);
}
GLWidget::~GLWidget()
{
if (texture)
{
delete texture;
}
}
void GLWidget::SetStatusBackImg(GLBackgorundImgType type)
{
switch (type)
{
case Normal:
m_varBackImg.load(":/skin/image/blue/GLBackImg/Normal.png");
m_varTimer.start(StatusBackImgShowInterval);
break;
case ChannelFailLink:
m_varBackImg.load(":/skin/image/blue/GLBackImg/ChannelLinkFail.png");
break;
case ChannelFailEncode:
m_varBackImg.load(":/skin/image/blue/GLBackImg/ChannelEncodeFail.png");
break;
case FailLinkAndFailEncode:
m_varBackImg.load(":/skin/image/blue/GLBackImg/LinkFailAndEncodeFail.png");
break;
case WrongImgSize:
m_varBackImg.load(":/skin/image/blue/GLBackImg/WrongImgSize.png");
break;
case NoInterEvent:
m_varBackImg.load(":/skin/image/blue/GLBackImg/NoInterEvent.png");
break;
default:
break;
}
m_varBackImg.convertToFormat(QImage::Format_RGBA8888);
m_bStartNewImg = false;
}
void GLWidget::Init(int iWidth, int iHeight)
{
m_iWidth = iWidth;
m_iHeight = iHeight;
m_varDataQueue.InitQueue(iWidth * iHeight * 4, 2);
m_varTimer.start(RealImgShowInterval);
}
bool GLWidget::UpdateImageData(byte* pFrameData)
{
if (nullptr != pFrameData)
{
int nRes = 0;
m_varDataQueue.PushBack(pFrameData, m_iWidth * m_iHeight * 4, nRes);
m_bStartNewImg = true;
return true;
}
return false;
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置清屏颜色
glEnable(GL_TEXTURE_2D); // 启用2D纹理映射
m_bIsOpenGLInit = true;
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
if (texture)
{
// 绑定纹理
texture->bind();
// 绘制矩形
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, -1.0f);
glEnd();
// 解绑纹理
texture->release();
}
}
void GLWidget::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
}
//void GLWidget::mousePressEvent(QMouseEvent* event)
//{
// // 处理鼠标点击事件
// if (event->button() == Qt::LeftButton)
// {
// int aa = 1;
//
// }
// else if (event->button() == Qt::RightButton)
// {
//
// }
//
// QOpenGLWidget::mousePressEvent(event);
//}
void GLWidget::setTextureImage(const QImage& image)
{
if (!m_bIsOpenGLInit)
{
// 如果尚未初始化,则延迟设置纹理图像
return;
}
makeCurrent();
if (!texture)
{
// 创建纹理对象
texture = new QOpenGLTexture(QOpenGLTexture::Target2D);
texture->setMinificationFilter(QOpenGLTexture::Linear);
texture->setMagnificationFilter(QOpenGLTexture::Linear);
texture->setWrapMode(QOpenGLTexture::ClampToEdge);
}
else
{
// 销毁现有的纹理对象并重新创建
texture->destroy();
texture->create();
}
texture->setSize(image.width(), image.height());
texture->setFormat(QOpenGLTexture::RGBA8_UNorm);
texture->setData(image);
doneCurrent();
update();
}
void GLWidget::OnTimer_UpdataVideoView()
{
if (m_bStartNewImg)
{
unsigned char* cTemp = m_varDataQueue.GetFrontPoint();
if (cTemp != NULL)
{
m_varImage = QImage((byte*)cTemp, m_iWidth, m_iHeight, QImage::Format_RGBA8888);
setTextureImage(m_varImage);
}
}
else
{
setTextureImage(m_varBackImg);
}
}