gpt4 book ai didi

c++ - Qt如何枚举屏幕?

转载 作者:可可西里 更新时间:2023-11-01 13:26:29 25 4
gpt4 key购买 nike

今天我发现 Qt 枚举屏幕的顺序 ( QGuiApplication::screens ) 与 Windows 中的顺序 ( EnumDisplayMonitors ) 不同。

这种差异背后的逻辑是什么,以便在混合使用 Windows API 和 Qt 时将其考虑在内?例如,如果需要在屏幕 #2 中显示某些内容(使用 Windows 枚举)。

这里是我用来测试的代码(也可用 in 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 无法报告更改。

Note that the side effect of this policy is that there is no way to change primary screen reported by Qt, unless we want to delete all existing screens and add them again whenever primary screen changes.

关于c++ - Qt如何枚举屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54351270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com