Получение информации о размере экрана

Для отображения окна по центру экрана или у правой или нижней границы необходимо знать размеры экрана. Для получения размеров экрана вначале следует вызвать статический метод QApplication::primaryScreen(), который возвращает указатель на объект основного экрана. Прототип метода:

#include <QScreen>
static QScreen *primaryScreen()

Получить размеры экрана позволяют следующие методы из класса QScreen:

  • geometry() — возвращает экземпляр класса QRect, содержащий координаты и размеры всего экрана. Прототип метода:
QRect geometry() const

Пример:

// #include <QScreen>
QScreen *screen = QApplication::primaryScreen();
QRect rect = screen->geometry();
qDebug() << rect.left() << rect.top();     // 0 0
qDebug() << rect.width() << rect.height(); // 1920 1080
  • availableGeometry() — возвращает экземпляр класса QRect, содержащий координаты и размеры только доступной части экрана (без размера Панели задач). Прототип метода:
QRect availableGeometry() const

Пример:

QScreen *screen = QApplication::primaryScreen();
QRect rect = screen->availableGeometry();
qDebug() << rect.left() << rect.top();     // 0 0
qDebug() << rect.width() << rect.height(); // 1920 1040

Получить список всех экранов позволяет статический метод screens() объекта приложения. Прототип метода:

static QList<QScreen *> screens()

Пример отображения окна примерно по центру экрана показан в листинге 3.2.

Листинг 3.2. Вывод окна примерно по центру экрана

#include <QApplication>
#include <QWidget>
#include <QScreen>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QWidget window;
   window.setWindowTitle("Вывод окна по центру экрана");
   window.resize(350, 70);

   QScreen *screen = QApplication::primaryScreen();
   QRect rect = screen->geometry();
   int x = (rect.width() - window.width()) / 2;
   int y = (rect.height() - window.height()) / 2;
   window.move(x, y);

   window.show();
   return app.exec();
}

В этом примере мы воспользовались методами width() и height(), которые не учитывают высоту заголовка и ширину границ. В большинстве случаев этого способа достаточно. Если необходима точность при выравнивании, то для получения размеров окна можно воспользоваться методом frameSize(). Однако, этот метод возвращает корректные значения только после отображения окна. Если код выравнивания по центру расположить после вызова метода show(), то окно отобразится вначале в одном месте экрана, а затем переместится в центр, что вызовет неприятное мелькание. Чтобы исключить мелькание следует вначале отобразить окно за пределами экрана, а затем переместить окно в центр экрана (листинг 3.3).

Листинг 3.3. Вывод окна по центру экрана

#include <QApplication>
#include <QWidget>
#include <QScreen>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QWidget window;
   window.setWindowTitle("Вывод окна по центру экрана");
   window.resize(350, 70);
   window.move(window.width() * -2, 0);
   window.show();

   QScreen *screen = QApplication::primaryScreen();
   QRect rect = screen->geometry();
   int x = (rect.width() - window.frameSize().width()) / 2;
   int y = (rect.height() - window.frameSize().height()) / 2;
   window.move(x, y);

   return app.exec();
}

Этот способ можно также использовать для выравнивания окна по правому краю экрана. Например, чтобы расположить окно в правом верхнем углу экрана следует заменить код, выравнивающий окно по центру, из предыдущего примера следующим кодом:

QScreen *screen = QApplication::primaryScreen();
QRect rect = screen->availableGeometry();
int x = rect.x() + rect.width() - window.frameSize().width();
window.move(x, rect.y());

Если попробовать вывести окно в правом нижнем углу, то может возникнуть проблема, так как в операционной системе Windows в нижней части экрана располагается Панель задач. В итоге окно будет частично расположено под Панелью задач. Чтобы при размещении окна учитывать местоположение Панели задач необходимо использовать метод availableGeometry(). Получить высоту Панели задач, расположенной в нижней части экрана, можно, например, так:

QScreen *screen = QApplication::primaryScreen();
QRect rect = screen->geometry();
int taskBarHeight = rect.height() -
                    screen->availableGeometry().height();

Следует также заметить, что в некоторых операционных системах Панель задач может быть прикреплена к любой стороне экрана. Кроме того, экран может быть разделен на несколько рабочих столов. Все это необходимо учитывать при размещении окна. За подробной информацией обращайтесь к документации по классу QScreen.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов