Qt中的屏幕录制

时间:2018-05-10 05:37:30

标签: c++ qt

我有两个显示器(一个显示器,另一个显示器)让我们说display1display2。我正试图在两个QLabel上显示这些显示Label1& Label2。 为此,我在QT中使用以下代码。

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

这是我特定的按钮,即当我点击“开始按钮”时,上面的代码将会运行,如果我点击“stop PushButton”我正在清除label1 ie {{ 1}}

通过这个我能够获得图像的截图,但我希望它是实时的,所以我想使用QTimer将图像加载到标签上并继续清除它,但它似乎不起作用。这是我的代码

ui->label->clear();

这不起作用,因为我在图片中获取图片,即图片

通过这种方式,我想要做两个不同的屏幕。所以现在我的问题是,更好的方式是将屏幕显示为#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); } 并稍后记录并存储。

1 个答案:

答案 0 :(得分:-1)

这种叠加的原因是标签清除不是即时完成(异步),另一方面,你正在立即拍摄下一张照片,因此出现以前的标签像素图等等......! 您需要通过合适的等待状态,使用其他计时器或您认为合适的任何机制来优化屏幕截图。

解决方案的本质是在家务工作(清算标签等)和拍摄屏幕之间设置合适的间隔。

例如:

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);
}