Илья
3 мая 2020 г. 17:38

Как сделать скриншот экрана QML приложения, запущенного в полноэкранном режиме, при помощи клавиши PrintScreen

#Qt, QML

Добрый день!
Столкнулся с возможно уже тривиальной проблемой, но на других форумах так и не нашел ответа. К примеру, здесь подобная проблема осталась не отвеченной: подобная проблема на другом форуме
Кому лень переходить дублирую здесь:
ОС Windows 10 (64-bit), версия Qt 12.8
Приложение работает в полноэкранном режиме (visibility: FullScreen)
Попытка создать скриншот экрана стандартной клавишей Print Screen. Итог - снимки отображают лишь скрин экрана во время запуска приложения, т.е. какие либо действия внутри приложения не делалаешь - скринится только экран на момент запуска. При записи видео с экрана та же история. Однако все меняется когда я меняю параметр visibility с "FullScreen" на любой другой, не полно-экранный (например "Windowed").

Кто подскажет в чем может быть загвоздка? Уже думаю сделать свой PrintScreen, однако подозреваю, что выйдет тоже самое....

2

Вам это нравится? Поделитесь в социальных сетях!

3
Evgenii Legotckoi
  • 4 мая 2020 г. 3:54

Добрый день.
QML Работает с OpenGL, возможно, что в полноэкранном режиме полностью забирает всё изображение на себе.
Возможно, вам поможет, если сделаете внутренний PrinScreen, который будет забирать изображение всего окна через метод grabToImage

    Илья
    • 8 мая 2020 г. 18:59

    Спасибо за ответ. В принципе я это подозревал. Попробую по вашему совету, отпишусь о результате))

      Илья
      • 16 мая 2020 г. 14:10
      • Ответ был помечен как решение.

      grabToImage как оказалось пригоден если хотите сделать скриншот какого-либо Item. В этом случае тогда все просто, типа аля

      1. mainLayout.grabToImage(function(result) { result.saveToFile("C:/touchPanel/screenshots/screen.png") })

      но чтобы сделать скриншот всего окна помогли эти посты
      пост 1
      пост 2

      там ругялся компилятор на некоторые вещи, пару шаманств и вот итоговый результат:
      файл screencapture.h

      1. #ifndef SCREENCAPTURE_H
      2. #define SCREENCAPTURE_H
      3.  
      4. #include <QObject>
      5. #include <QQuickWindow>
      6. #include <QString>
      7. #include <QImage>
      8.  
      9. class screenCapture : public QObject
      10. {
      11. Q_OBJECT
      12. public:
      13. explicit screenCapture (QQuickWindow *parent = 0);
      14.  
      15. public slots:
      16. void capture (QString const &path) const;
      17.  
      18. private:
      19. QQuickWindow *currentWindow;
      20. };
      21.  
      22. #endif // SCREENCAPTURE_H
      23.  

      файл screencapture.cpp

      1. #include "screencapture.h"
      2.  
      3. screenCapture::screenCapture(QQuickWindow *currentWindow) :
      4. QObject(0), currentWindow (currentWindow)
      5. {
      6. }
      7.  
      8. void screenCapture::capture (QString const &path) const
      9. {
      10. QImage img = currentWindow->grabWindow();
      11. img.save(path);
      12. }

      файл main.cpp

      1. #include <QGuiApplication>
      2. #include <QQmlApplicationEngine>
      3. #include <QQmlContext>
      4. #include "screencapture.h"
      5.  
      6. int main(int argc, char *argv[])
      7. {
      8. QGuiApplication app(argc, argv);
      9. QQmlApplicationEngine engine;
      10.  
      11. QQmlContext *context = engine.rootContext();
      12. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
      13. if (engine.rootObjects().isEmpty())
      14. return -1;
      15.  
      16. // создаем контекст и экземпляр класса screenCapture
      17. QObject *topLevel = engine.rootObjects().value(0);
      18. QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
      19. screenCapture screenShot(window);
      20. engine.rootContext()->setContextProperty("screenShot", &screenShot);
      21.  
      22. return app.exec();
      23. }

      файл qml

      1. // в любом месте где нужно
      2. screenShot.capture ("C:/touchPanel/screenshots/screen"+cntScreenCapture+".png")

      в общем вдруг кому поможет

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        • Последние комментарии
        • IscanderChe
          12 апреля 2025 г. 17:12
          Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
        • AK
          1 апреля 2025 г. 11:41
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          9 марта 2025 г. 21:02
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          9 марта 2025 г. 16:14
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          22 ноября 2024 г. 21:51
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…