Запись экрана в Qt - PullRequest
       4

Запись экрана в Qt

0 голосов
/ 10 мая 2018

У меня есть два дисплея (один монитор, другой проектор), скажем, display1, display2. Я пытаюсь показать это мониторам на двух QLabels Label1 & Label2. Для этого я использую следующий код в QT.

QScreen *screen = QGuiApplication::primaryScreen();
QPixmap originalPixmap = screen->grabWindow(0);
ui->label->setPixmap(originalPixmap);

это я сделал для конкретной кнопки, т. Е. Когда я нажимаю кнопку «Пуск», запускается приведенный выше код, и если я нажимаю «кнопка остановки» Я очищаю label1 т.е. ui->label->clear();

Таким образом, я могу получить снимки экрана с изображениями, но я хочу, чтобы оно было вживую, поэтому я решил использовать QTimer, чтобы продолжать загружать изображения на этикетку и очищать его, но это не похоже на работу. Вот мой код

#include "ScreenCapture.h"
#include "ui_ScreenCapture.h"

ScreenCapture::ScreenCapture(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ScreenCapture)
{
    ui->setupUi(this);


    CaptureTimer=new QTimer(this);
    CaptureTimer->setInterval(30);
    connect(CaptureTimer,SIGNAL(timeout()),this,SLOT(load_an_Image()));
    CaptureTimer->start();
}
void ScreenCapture::on_pbtn_start_clicked()
{
    load_an_Image();
}

void ScreenCapture::on_pbtn_stop_clicked()
{
   ui->label->clear();
}

void ScreenCapture::load_an_Image()
{
    on_pbtn_stop_clicked();
    QScreen *screen = QGuiApplication::primaryScreen();
    QPixmap originalPixmap = screen->grabWindow(0);
    ui->label->setPixmap(originalPixmap);
}

Это не работает, так как я получаю изображение внутри картинки, т.е. картинка

Таким образом, я подумал сделать для двух разных экранов. Итак, теперь мой вопрос: лучший способ показать экраны в режиме реального времени на QLabels, а затем записать их и сохранить.

1 Ответ

0 голосов
/ 10 мая 2018

Причиной этого наложения является то, что очистка метки не завершается мгновенно (асинхронно), с другой стороны, вы делаете следующий снимок сразу же, таким образом, появляется предыдущий рисунок метки и так далее ...! Вам необходимо уточнить снимки экрана с помощью подходящих состояний ожидания, используя другой таймер или любой механизм, который вы считаете подходящим.

Суть решения состоит в том, чтобы установить подходящий интервал между ведением домашнего хозяйства (очистка этикетки и т. Д.) И снимком экрана.

например:

ScreenCapture::ScreenCapture(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ScreenCapture)
{
    ui->setupUi(this);
    CaptureTimer=new QTimer(this);
    CaptureTimer->setInterval(200);
    connect(CaptureTimer, &QTimer::timeout, this, &ScreenCapture::on_pbtn_start_clicked);
    CaptureTimer->start();
}
void ScreenCapture::on_pbtn_start_clicked()
{
    ui->label->clear();
    QTimer::singleShot(20,this, &ScreenCapture::load_an_Image);
}
void ScreenCapture::on_pbtn_stop_clicked()
{
    ui->label->clear();
}

void ScreenCapture::load_an_Image()
{
    screen = QGuiApplication::primaryScreen();
    QPixmap originalPixmap = screen->grabWindow(0);
    ui->label->setPixmap(originalPixmap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...