Илья
May 3, 2020, 5:38 p.m.

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

#Qt, QML

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

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

2

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • May 4, 2020, 3:54 a.m.

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

    Илья
    • May 8, 2020, 6:59 p.m.

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

      Илья
      • May 16, 2020, 2:10 p.m.
      • The answer was marked as a solution.

      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")

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

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup