#include "GLWidget.h" #include #include #include #include #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); } }