最近使用4K摄像头,并在QT程序中启用了高清显示适配设置:

#if (QT_VERSION >= QT_VERSION_CHECK(5,8,0))QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

然后在QOpenGLWidget中进行了绘制:

定义:

class CQtViewerGl : public QOpenGLWidget, protected QOpenGLFunctions_2_0

绘制:

void CQtViewerGl::paintGL()
{makeCurrent();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);renderImage();
}

图像绘制方法:

void CQtViewerGl::renderImage()
{drawMutex.lock();makeCurrent();glClear(GL_COLOR_BUFFER_BIT);if (!mRenderQtImg.isNull()){glLoadIdentity();glPushMatrix();{// glRasterPos2i()改变光栅位置 ---> Centering image in draw areaglRasterPos2i(mRenderPosX, mRenderPosY);//glPixelZoom() 设置象素写操作沿X和Y方向的放大或缩小因子。缺省情况下,zoomx、zoomy都是1.0。如果它们都是2.0,//则每个图像象素被画到4个屏幕象素上面。glPixelZoom(1, -1); ///防止图像上下翻转/*glDrawPixels 绘制像素数据调用这个函数前必须先设置当前光栅位置,若当前光栅位置无效,则给出该函数时不画任何图形,并且当前光栅位置仍然保持无效。 */GLenum format = GL_RGB;              QImage::Format mt = mRenderQtImg.format();if (mt == QImage::Format_RGB32)format = GL_RGBA;glDrawPixels(mRenderQtImg.width(), mRenderQtImg.height(), format, GL_UNSIGNED_BYTE, mRenderQtImg.bits());}glPopMatrix();// endglFlush();}drawMutex.unlock();
}

运行结果:

图像仅在左下角1/4区域显示图像,无法完整的绘制。

原因:

启用AA_EnableHighDpiScaling后,QT界面会在高清模式(如4K)下进行缩放,但QOpenGLWidget内部的OpenGL不归属于QT的缩放范围,所以QopenGL内部尺寸需要参考显示器的原始像素尺寸。具体参考如下链接:

https://stackoverflow.com/questions/41740691/qgraphicsview-scaling-with-high-dpi

解决方法:

1. Resize的时候计算真实宽高

注意如下代码中 QApplication::desktop()->devicePixelRatio()相关的部分:

void CQtViewerGl::resizeGL(int width, int height)
{makeCurrent();//参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。int ratio = QApplication::desktop()->devicePixelRatio();glViewport(0, 0, (GLint)width*ratio, (GLint)height*ratio);/*glMatrixMode设置当前矩阵模式:GL_MODEVIEW,对模型视景矩阵堆栈应用随后的矩阵操作。GL_PROJECTION,对投影矩阵应用随后的矩阵操作。GLTEXTURE,对纹理矩阵堆栈应用随后的矩阵操作。*/glMatrixMode(GL_PROJECTION);glLoadIdentity();//glOrtho 参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标)——坐标全相对于窗口左下角--原点)glOrtho(0, width*ratio, -height*ratio, 0, 0, 1); ///防止图像上下翻转glMatrixMode(GL_MODELVIEW);recalculatePosition();emit imageSizeChanged(mRenderWidth, mRenderHeight);updateScene();
}

2. 如需计算绘制图像的尺寸,也需要考虑QApplication::desktop()->devicePixelRatio()。

启用后,问题得到解决。QOpenGLWidget已可正常绘制图像。

针对这个问题,查阅了很多资料,也耗费了很多时间。希望大家不要再入坑。

关于4K高清分辨率下,QOpenGLWidget无法完整绘制图像问题的解决相关推荐

  1. 百年古董电影秒变4K高清、60FPS,AI插值,还能着色

    点击我爱计算机视觉标星,更快获取CVML新技术 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 古董级电影秒变4K高清,还能黑白变彩色. 由于技术原因,最早的影像资料都是较为模糊且卡顿的, ...

  2. 4K高清编码器介绍及使用操作说明

    4K高清编码器介绍: 4K高清编码器是一款超高清( U H D )视频编码设备,采用的是H.265编码技术,h265视频编码可以广泛应用到广播,教育,医疗,视频会议等项目应用中,4K编码器大部分都是可 ...

  3. 4K高清,为什么离我们还是那么远!?

    从480p标清到720p高清,再由720p高清到1080p全高清,直到最近的4K.8K超高清开始进入民用领域(在视频监控领域也用像素来划分,100万,200万,500万,800万,1000万,1200 ...

  4. 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 爬虫是什么? 网络爬虫,也叫网络蜘蛛(Web Spider).它根据网页地 ...

  5. 10个值得珍藏的4K高清壁纸网站推荐

    作为打开电脑 or 手机第一眼就看到的桌面,给它设置一个赏心悦目的桌面壁纸还是必不可少的. 下面分享了 10 个值得珍藏的高清桌面壁纸网站,支持各种图片比例和分辨率,从 720P 到 4K.8K 应有 ...

  6. 11个值得珍藏的4K高清壁纸网站推荐

    前言 由于前几天因需求须找一些视觉素材,翻来覆去整了一些,整理了10个图片素材网站可以给大家收藏使用& 作为打开电脑 or 手机第一眼就看到的桌面,给它设置一个赏心悦目的桌面壁纸还是必不可少的 ...

  7. 今日芯声 | 不寒而栗!针孔摄像头画质竟然是4K高清的

    "今日芯声"是读芯术推出的一档简读栏目,汇聚每日国内外最新最热的AI应用资讯,敬请关注. 1.看完让人不寒而栗!针孔摄像头画质竟然是4K高清的 随着各类新闻发酵,针孔摄像头已经成为 ...

  8. python网络爬虫快速下载4K高清壁纸

    python网络爬虫快速下载4K高清壁纸 此处给出下载壁纸的链接地址彼岸图网,进入网站之后,我们看到可以下载风景,游戏,动漫,美女等类型的4K图片,装逼一下,re库有贪婪匹配,那我们就写一个通用代码来 ...

  9. 4K高清壁纸应用Pap.er Mac中文版

    pap.er mac版是一款专为mac用户设计的5K高清壁纸应用,让您可以每天享受来自全球新鲜精美的壁纸!Pap.er拥有美观的界面,自动换取壁纸,千万海量精美壁纸任您选.在Pap.er Mac下载壁 ...

最新文章

  1. OPPO海外官方调试ID
  2. jQuery选择器总结
  3. 厦门计算机高级职称,2021年厦门工程师职称属于哪种职称?
  4. 基于jQuery的图片异步加载和预加载实例
  5. java动画闪烁_优化Java动画编程中的显示效果
  6. python函数应用实例_【Python 第22课】 函数应用示例
  7. ZEN CART 在LINUX系统下设置邮箱方法---用GMAIL设置,方法选择SMTPAUTH
  8. HDU 1520Anniversary party(树型DP)
  9. 线性表--链式实现方式
  10. Wannafly模拟赛2
  11. bzoj3238 [Ahoi2013]差异 后缀自动机
  12. android:screenOrientation属性
  13. 大道至简第二章-‘是懒人造就了方法’读后感
  14. linux 已有目录挂载磁盘
  15. 便捷开票二维码应用简介
  16. C语言可变参数问题(va_list,va_start,va_arg,va_end用法及定义)
  17. 跟着我干你技术入股,当面临这样的诱惑,我们该怎么办?
  18. linux安装glib,glib源码安装使用方法
  19. JavaSE练习题之不死神兔
  20. android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、爆炸菜单、风扇叶片效果等源码

热门文章

  1. js桌面应用 Linux,从 1 到完美,用 js 和 electron 写一个桌面应用
  2. DRL for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks
  3. JAVA自定义协议解析
  4. STM32MP157驱动开发——4G通信模块驱动
  5. 无线群控服务器转让,群控客户端绑定服务器文件
  6. buildroot 使用
  7. Linux系统和乌班图Ubuntu是什么关系?
  8. 毕业设计-基于微信小程序的移动端轻量 GIS 系统
  9. dede获取上级栏目名称
  10. OpenStack全网最全部署教程