Вопрос или проблема
Я пытаюсь сделать снимок экрана в 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
- Получите доступ к экрану: В 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, особое внимание следует уделить разрешениям на запись экрана. Убедитесь, что ваше приложение имеет необходимые права:
- Откройте Системные настройки > Безопасность и конфиденциальность > Запись экрана.
- Убедитесь, что ваше приложение находится в списке и имеет разрешение.
Заключение
Если все вышеуказанные методы не помогли, убедитесь, что вы компилируете свою программу с актуальной версией Qt, и проверьте, не конфликтуют ли какие-либо другие приложения или системные настройки с функцией скриншота. Удачи, и если возникнут дополнительные вопросы, не стесняйтесь спрашивать!