Илья
Мамыр 3, 2020, 5: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, 6:59 Т.Қ.

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

      Илья
      • Мамыр 16, 2020, 2: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")

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

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз