Сделать полноэкранный скриншот в Qt. Как?

Вопрос или проблема

Я пытаюсь сделать снимок экрана в Qt. Я использовал пример программы для создания снимков экрана, который включен в пакет. (Он здесь: https://doc.qt.io/qt-6/qtwidgets-desktop-screenshot-example.html, код доступен здесь: https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/desktop/screenshot?h=6.7)

Но он делает снимок только приложения Qt вместе с фоном рабочего стола, т.е. единственным окном, которое включается, является окно приложения Qt. Он не делает снимок того, что на самом деле находится на экране. Как я могу это исправить?

Для уточнения: первое изображение, следующее за этим, является желаемым снимком экрана, который сработал один раз, и только один раз (в первый раз компиляции примерной программы для создания снимков экрана, по какой-то причине), а каждый раз после этого результат снимка включает только окно приложения Qt:

Желаемый снимок экрана:
желаемый снимок экрана

Ограниченный снимок экрана:
ограниченный снимок экрана

Я также пытался сделать это, используя нативный API Mac OS, и это дало тот же результат.

Я установил разрешения, чтобы разрешить этим программам делать запись экрана в системных настройках Mac OS.

Буду признателен за любую помощь. Спасибо.

Ответ или решение

Чтобы сделать полный скриншот экрана в Qt, вам нужно использовать метод, который позволит захватить изображения всех окон, а не только вашего приложения. Проблема, с которой вы столкнулись, связана с тем, что вы, вероятно, используете функцию, которая ограничивает захват только активным окном.

Вот несколько способов, как вы можете зарегистрировать полный скриншот экрана:

Подход 1: Использование QScreen

  1. Получите доступ к экрану: В Qt вы можете использовать класс QScreen, чтобы захватить изображение всего экрана.
#include <QApplication>
#include <QScreen>
#include <QPixmap>

void takeFullScreenshot() {
    QScreen *screen = QGuiApplication::primaryScreen();
    QPixmap screenshot = screen->grabWindow(0); // 0 - это идентификатор полного экрана
    screenshot.save("screenshot.png"); // Сохраните скриншот как файл
}

Подход 2: Использование QPainter

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

#include <QApplication>
#include <QScreen>
#include <QPixmap>
#include <QPainter>

void takeFullScreenshot() {
    QScreen *screen = QGuiApplication::primaryScreen();
    if (screen) {
        QPixmap screenshot = screen->grabWindow(0);
        // Здесь можно дополнительными обработками отобразить на скриншоте, если это необходимо
        screenshot.save("screenshot.png");
    }
}

Подход 3: Проверка прав доступа в macOS

Поскольку вы упомянули, что работаете на macOS, особое внимание следует уделить разрешениям на запись экрана. Убедитесь, что ваше приложение имеет необходимые права:

  1. Откройте Системные настройки > Безопасность и конфиденциальность > Запись экрана.
  2. Убедитесь, что ваше приложение находится в списке и имеет разрешение.

Заключение

Если все вышеуказанные методы не помогли, убедитесь, что вы компилируете свою программу с актуальной версией Qt, и проверьте, не конфликтуют ли какие-либо другие приложения или системные настройки с функцией скриншота. Удачи, и если возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...