[英]How does Qt enumerate screens?
今天我发现Qt枚举屏幕的顺序( QGuiApplication::screens
)与Windows中的顺序( EnumDisplayMonitors
)不同。
这种差异背后的逻辑是什么,以便在混合使用Windows API和Qt时将其考虑在内? 例如,如果需要在屏幕#2中显示某些内容(使用Windows枚举)。
这里是我用来测试的代码(也可以在GitHub中使用 ):
#include <qapplication.h>
#include <qdebug.h>
#include <qscreen.h>
#include <Windows.h>
#include <iostream>
std::ostream& operator<<(std::ostream& of, const RECT& rect)
{
return of << "RECT(" << rect.left << ", " << rect.top << " " << (rect.right - rect.left) << "x" << (rect.bottom - rect.top) << ")";
}
BOOL CALLBACK printMonitorInfoByHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
auto index = (int*)dwData;
std::cout << ++*index << " " << *lprcMonitor << std::endl;
return TRUE;
}
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
qDebug() << "*** Qt screens ***";
const auto screens = qApp->screens();
for (int ii = 0; ii < screens.count(); ++ii) {
qDebug() << ii + 1 << screens[ii]->geometry();
}
qDebug() << "*** Windows monitors ***";
int index = 0;
EnumDisplayMonitors(NULL, NULL, printMonitorInfoByHandle, (LPARAM)&index);
return 0;
}
我的显示配置是从左到右, 2
(1280x1024), 3
(1920x1080), 1
(1920x1080),是我的主要屏幕3
。
结果:
*** Qt screens ***
1 QRect(0,0 1920x1080)
2 QRect(1920,233 1920x1080)
3 QRect(-1280,47 1280x1024)
*** Windows monitors ***
1 RECT(1920, 233 1920x1080)
2 RECT(-1280, 47 1280x1024)
3 RECT(0, 0 1920x1080)
就我在不同系统中看到的而言, EnumDisplayMonitors
按照显示设置中定义的顺序返回监视器,而QGuiApplication::screens
总是在第一个位置显示主屏幕(实际上, QGuiApplication::primaryScreen
只是这样做:返回第一个元素)。
查看源代码,在Windows Qt中也使用EnumDisplayMonitors
函数,但基本上将主屏幕移动到第一个位置(它实际上插入主屏幕的第一个位置,同时在列表的末尾插入任何其他监视器)。
因此,主屏幕将位于第一个位置,索引低于主屏幕的屏幕将移动一个位置,而其余屏幕将匹配索引。
作为旁注,取自代码的注释,如果在执行应用程序期间更改主屏幕,Qt将无法报告更改。
请注意,此策略的副作用是无法更改Qt报告的主屏幕,除非我们要删除所有现有屏幕并在主屏幕更改时再次添加它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.