确定Qt/ c++中可用的显示分辨率

Determine available display resolutions in Qt/C++

本文关键字:显示 分辨率 Qt c++ 确定      更新时间:2023-10-16

在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没有办法获得可用分辨率的列表,也不能切换它们。

你需要寻找关于它的特定于平台的问题,并询问它们是否存在。一个问题应该覆盖一个平台