确定Qt/ c++中可用的显示分辨率
Determine available display resolutions in Qt/C++
在Windows和其他桌面操作系统的显示设置中总是一个组合框,显示所有可用的显示分辨率。
我需要这种组合框在Qt或c++和我卡住了。
我在这里找到了一个c#方法:如何使用c#列出可用的视频模式?
我发现了一个c++方法:如何在多监视器系统中检测最大化事件
MSDN在EnumDisplaySettingsEx函数文档中说所有的显示分辨率都可以通过迭代参数iModeNum来获得:
图形模式索引从0开始。要获取所有显示设备的图形模式的信息,对EnumDisplaySettingsEx进行一系列调用,如下所示:在第一次调用时将iModeNum设置为0,并在每次后续调用时将iModeNum增加1。继续调用该函数,直到返回值为零。
我已经修改了c++的方法来在Windows中实现我的目标:
#include <QCoreApplication>
#include <windows.h>
#include <stdio.h>
#define DEFAULT_DISPLAY_WIDTH 0
#define DEFAULT_DISPLAY_HEIGHT 0
#define DEFAULT_DISPLAY_FREQUENCY 60
#define DEFAULT_DISPLAY_SOURCE 0
struct DisplayResolution
{
DisplayResolution( int _width = DEFAULT_DISPLAY_WIDTH,
int _height = DEFAULT_DISPLAY_HEIGHT,
int _frequency = DEFAULT_DISPLAY_FREQUENCY,
int _defaultSource = DEFAULT_DISPLAY_SOURCE )
{
width = _width;
height = _height;
frequency = _frequency;
defaultSource = _defaultSource;
}
int width;
int height;
int frequency;
int defaultSource;
};
typedef std::vector<DisplayResolution>::iterator DisplayResolutionIterator;
std::vector<DisplayResolution> getAvailableDisplayResolutions( )
{
DISPLAY_DEVICE disp;
DISPLAY_DEVICE adapter;
DEVMODE mode;
std::vector<DisplayResolution> displayResolutions;
int i = 0, j = 0, display_count = 0, k = 0;
// Initialize win32 structs.
memset(&disp, 0, sizeof(DISPLAY_DEVICE));
disp.cb = sizeof(DISPLAY_DEVICE);
memset(&adapter, 0, sizeof(DISPLAY_DEVICE));
adapter.cb = sizeof(DISPLAY_DEVICE);
memset(&mode, 0, sizeof(DEVMODE));
mode.dmSize = sizeof(DEVMODE);
//memset(the_displays, 0, sizeof(the_displays));
// adapter loop:
while(EnumDisplayDevices(NULL, i, &adapter, 0))
{ // multiple displays on single adapter loop:
j = 0;
qDebug() << (TCHAR*)&adapter.DeviceName;
while(EnumDisplayDevices((TCHAR*)&adapter.DeviceName, j, &disp, 0))
{
// The device must be active, attached to desktop and not a mirroring device.
if((disp.StateFlags & DISPLAY_DEVICE_ACTIVE)
&& (disp.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
&& !(disp.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
{
// read display settings.
k = 0;
while(EnumDisplaySettingsEx((TCHAR*)&adapter.DeviceName, k, &mode, 0))
{
displayResolutions.push_back( DisplayResolution(mode.dmPelsWidth,
mode.dmPelsHeight,
mode.dmDisplayFrequency,
mode.dmDefaultSource) );
// Reset
memset(&mode, 0, sizeof(DEVMODE));
mode.dmSize = sizeof(DEVMODE);
++display_count;
++k;
}
}
// Reset
memset(&disp, 0, sizeof(DISPLAY_DEVICE));
disp.cb = sizeof(DISPLAY_DEVICE);
++j;
}
// Reset
memset(&adapter, 0, sizeof(DISPLAY_DEVICE));
adapter.cb = sizeof(DISPLAY_DEVICE);
++i;
}
return displayResolutions;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::vector<DisplayResolution> displayResolutions = getAvailableDisplayResolutions( );
DisplayResolutionIterator it = displayResolutions.begin();
DisplayResolutionIterator itEnd = displayResolutions.end();
for( it; it != itEnd; ++it )
{
printf( "Resolution: " );
printf( "%i x %i", (*it).width, (*it).height );
printf( " (%iHz)", (*it).frequency );
printf( " @Source:%i", (*it).defaultSource );
printf( "n" );
}
return a.exec();
}
希望它能帮助Windows用户阅读这篇文章,但是Unix呢?
我知道Qt中的一个方法,但这只会通过QDesktopWidget::availableGeometry收集当前的显示分辨率。
Qt有一个方法来接收所有可用的显示分辨率吗?
亲切的问候,Pixtar
Qt不提供任何带有此类信息的api。您可以通过QScreen:geometry()
获得给定屏幕的当前分辨率。但是Qt没有办法获得可用分辨率的列表,也不能切换它们。
你需要寻找关于它的特定于平台的问题,并询问它们是否存在。一个问题应该覆盖一个平台
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- X11,更改分辨率并使窗口全屏显示
- 当插入第二个监视器时,全屏Direct3D9设备仅以本机分辨率显示
- 在视窗/C++中强制显示分辨率
- 访问Ximea相机并使用OpenCV设置预定义的分辨率时,由于相机默认分辨率的大小为Mat,因此显示混乱的输出
- Cocos2d-x - 安卓 - 某些图像不会以相同的分辨率显示在某些设备上
- 确定Qt/ c++中可用的显示分辨率
- winapi -更改显示分辨率不工作
- OpenCV 不会显示分辨率大于 640x480 的相机源