И
3 мая 2020 г. 7:38

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

#Qt, QML

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
3

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

И

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

И

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

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

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

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

#ifndef SCREENCAPTURE_H
#define SCREENCAPTURE_H

#include <QObject>
#include <QQuickWindow>
#include <QString>
#include <QImage>

class screenCapture : public QObject
{
    Q_OBJECT
public:
    explicit screenCapture (QQuickWindow *parent = 0);

public slots:
    void capture (QString const &path) const;

private:
    QQuickWindow *currentWindow;
};

#endif // SCREENCAPTURE_H

файл screencapture.cpp

#include "screencapture.h"

screenCapture::screenCapture(QQuickWindow *currentWindow) :
    QObject(0), currentWindow (currentWindow)
{
}

void screenCapture::capture (QString const &path) const
{
    QImage img = currentWindow->grabWindow();
    img.save(path);
}

файл main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "screencapture.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QQmlContext *context = engine.rootContext();
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    // создаем контекст и экземпляр класса screenCapture
    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    screenCapture screenShot(window);
    engine.rootContext()->setContextProperty("screenShot", &screenShot);

    return app.exec();
}

файл qml

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
s
3 июня 2020 г. 2:56
silo1995

C++ - Тест 003. Условия и циклы

  • Результат:35баллов,
  • Очки рейтинга-10
АП
2 июня 2020 г. 22:11
Алексей Пикенин

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
2 июня 2020 г. 14:04
Даниил Чижевский

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
4 июня 2020 г. 12:10
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Полностью скопировал пример - всё правильно работает. Значит, где-то у меня ошибки в тестовом проекте. Буду разбираться. Извините за беспокойство. :)
4 июня 2020 г. 8:08
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Во все колонки установили? Нужно на все колонки устанавливать.
4 июня 2020 г. 7:59
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Код делегата полностью скопировал в свой тестовый проект, но окрашивается не вся строка целиком, а только ячейка, на которую указывает курсор.
4 июня 2020 г. 7:12
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Добрый день. Удобства ради. В больших проектах удобнее вызывать BaseClass, чем постоянно смотреть, от чего конкретно наследован текущий класс. Экономит время.
Сейчас обсуждают на форуме
МА
f
3 июня 2020 г. 2:49
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
2 июня 2020 г. 3:46
Евгений Легоцкой

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
2 июня 2020 г. 3:01
Евгений Легоцкой

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
a
1 июня 2020 г. 11:26
alekseyttrv

SSL на Android

у меня стоит версия Qt 5.14.2. В настройках android поставил openssl из коробки, и этот прроект автоматически стянулся. Достаточно было только добавить в .pro-файл строку после этого и все …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB