0

в Windows и других настольных операционных системах - это всегда поле со списком в настройках отображения, показывающее все доступные разрешения дисплея.Определение доступных разрешений дисплея в Qt/C++

Мне нужен такой ящик со списком в Qt или C++, и я застрял.

Я нашел C# подход здесь: How to list available video modes using C#?

Я нашел ++ подход C: How to Detect Maximize event on multi-monitor system

MSDN говорит в EnumDisplaySettingsEx function доку, что все разрешения экрана могут быть получены путем итерации по аргументу iModeNum:

Индексы графического режима начинаются с нуля. Чтобы получить информацию обо всех графических режимах устройства отображения, сделайте серию вызовов EnumDisplaySettingsEx следующим образом: Установите iModeNum в ноль для первого вызова и увеличьте iModeNum на один для каждого последующего вызова. Продолжайте вызывать функцию до тех пор, пока возвращаемое значение не станет равным нулю.

Я изменил подход 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

+0

Если вы используете X11, для этого существуют X-специфические механизмы. Для всего остального вам понадобится подход, ориентированный на бэкэнд. –

+0

Итак, вы имеете в виду что-то вроде [XOpenDisplay] (https://linux.die.net/man/3/xopendisplay) и [DefaultScreenOfDisplay] (https://linux.die.net/man/3/defaultscreenofdisplay). Насколько я понял - это даст мне доступ только к текущему разрешению экрана, но не ко всем доступным разрешениям. – Pixtar

+0

Это дает вам только текущее разрешение. В любом случае, это отдельный вопрос - возможно, поиск, и вы найдете его уже спрошенным и ответили. –

ответ

0

Qt не предоставляет API, с такой информацией. Вы можете получить текущее разрешение данного экрана через QScreen:geometry(). Но нет способа Qt получить список доступных разрешений и не переключать их.

Вам необходимо найти конкретные вопросы о платформе и спросить их, если они не существуют. Один вопрос должен охватывать одну платформу.