从Retina显示器移动到普通显示器,只能显示部分画面
QtAV, Qt version and platform
QtAV: 1.11 Qt: 5.9.1 platform: OS X
Reproduction steps
Mac下启动进程,默认生成窗口在Retina显示器上,然后移动到普通显示器,播放画面宽高为实际的1/2。
Expected behavior
播放画面宽高不变。
Actual behavior
播放画面宽高变为正常1/2。
看了之前的issues,做了以下修改,已经OK。
#include <QtAVWidgets/global.h>
video_output_ = new QtAV::VideoOutput(QtAV::VideoRendererId_GLWidget2, this);
修改为VideoRendererId_GLWidget2之后,在Retina上显示全图,但是只显示整体的1/4大小。

QtAV 1.11.0(Jan 23 2018, 20:45:18) "Build with Qt-5.9.1" "FFmpeg/Libav configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda"
"OpenGL version: 2.1 hasGLSL: 1" "GL_VERSION: 2.1 INTEL-10.30.14" "GL_VENDOR: Intel Inc." "GL_RENDERER: Intel Iris Pro OpenGL Engine" "GL_SHADING_LANGUAGE_VERSION: 1.20" "Is OpenGLES: 0" "Is EGL: 0" "GLSL version: 120" "Has PBO: 1" "16 bit texture depth: 16.\n" "using gl_param_3r16" "Has 16bit texture: 1" "check gl3 rg: 0x822B" "Has RG texture: 1"
之在retina上播放画面大小怎么样?
用默认VideoOutput时,retina显示器效果:
普通显示器(分辨率1920x1080)显示器效果:

用Player试了一下,有问题的如下:
- OpenGL Widget
- QGLWidget2
没问题的如下:
- Widget
之前没有更新代码,用Widget不出图,更新了最新Qt 5.10.0,QtAV最新master代码后,可以正常出图,先用Widget解决。
就是说在第一个显示器上正常,换了就不对了?这个我监听下QGuiApplication::primaryScreenChanged()信号试试,应该可以解决
你试下最新代码
还是有点问题,VideoRendererId_GLWidget2情况下,必须要Resize Window,才能刷新VideoOutput,更新到对应的分辨率上。
默认情况时,还是老问题,不能解决。
主要是能检测到显示器变化就行,你随便写个代码看看qApp-> primaryScreenChanged()这个信号会不会出发,然后再看看OpenGLVideo::updateViewport()会不会再此时被调到,我没设备没法测
试了一下,检测不到primaryScreenChanged这个信号。
只能在MainWindow的moveEvent事件中,检查显示器序号才可行: QDesktopWidget *desktop = QApplication::desktop(); desktop->screenNumber(this);
https://bugreports.qt.io/browse/QTBUG-33048
看来这个接口确实有问题,只能用其他方法绕过去了。
感觉没发信号也是有道理的,因为你的情况只是app一个窗口移动到已经存在的显示器,primaryScreenChanged()感觉应该是显示器拔掉插上另一个的意思。如果app有多个窗口分别在不同的显示器显示,那用primaryScreenChanged肯定不行了。看上去比较符合的接口应该是QWindow.screenChanged(), 可以针对每个窗口的屏幕变化,你可以把这个信号处理下,槽里调用VideoRenderer.opengl()->updateViewport()试试。貌似这些只能在app里处理了
确实可以👍
不知道qwidget内部是怎么实现的,回头看看源码
后来你是怎么获取QWindow对象的?
QDesktopWidget *desktop = QApplication::desktop();
int screen_number = desktop->screenNumber(this);
if (screen_number == current_screen_number_) return;
current_screen_number_ = screen_number;
int screen_ratio = desktop->screen(current_screen_number_)->devicePixelRatio();
if (screen_ratio == current_screen_ratio_) return;
current_screen_ratio_ = screen_ratio;
LOG4CPLUS_WARN_FMT(LOGGER_NAME, "screen changed, current number: %d, "
"current ratio: %d, change video output",
current_screen_number_, current_screen_ratio_);
我是这么区分屏幕和分辨率变化的,试了其他方式,都判断不准确。
主要是什么时候去判断变化?
我是在moveEvent里面检查的
好吧,这样的话在qtav里判断不好实现,翻了qt的代码监听变化的方法都是内部使用非公开的接口
ScreenChangeInternal 有这个事件触发的 但是 不知道怎么刷新videooutput