QT截图widget子窗口的图片

QT截取子窗口或者播放窗口图片分为两个步骤,先获取子窗口widget在屏幕中的坐标和宽高,然后调用抓取屏幕图片的方法抓取子窗口坐标和宽高的表示的区域;

 

 

(1)子窗口获取相对屏幕的坐标

假如要抓取子窗口widgetmid的图片,先计算widgetmid在整个屏幕中的坐标;

   QRect widgetRect;
    //widgetmid在屏幕中的坐标
    QPoint point = ui.widgetmid->mapToGlobal(QPoint(0, 0));
    widgetRect.setX(point.x());
    widgetRect.setY(point.y());
    //widgetmid的宽高
    widgetRect.setWidth(ui.widgetmid->width());
    widgetRect.setHeight(ui.widgetmid->height());
    //抓子窗口区域图片,并显示在CutPicWidget
    m_CutPicWidget.CutWidgetPic(widgetRect);
    //m_CutPicWidget显示窗口截图,覆盖在ui.widgetmid之上
    m_CutPicWidget.setGeometry(0, 0, ui.widgetmid->width(), ui.widgetmid->height());
    m_CutPicWidget.show();
    m_CutPicWidget.raise();

(2)抓取区域图片并保存

QPixmap m_widgetScreenPic;是一个变量

int CutPicWidget::CutWidgetPic(QRect rect)
{
    //抓取区域截图
    QScreen *screen = QGuiApplication::primaryScreen();
    m_widgetScreenPic = screen->grabWindow(0, rect.x(), rect.y(), rect.width(), rect.height());//抓取widget的图片
    m_widgetScreenPic = m_widgetScreenPic.scaled(QSize(rect.width(), rect.height()), Qt::KeepAspectRatio);
    //显示图片
    ui.labelPic->setPixmap(m_widgetScreenPic);
    //保存图片
    QString filePathName = "cut-";
    filePathName += QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz");
    filePathName += ".png";
    filePathName = QDir::currentPath() + "/" + filePathName;
    m_widgetScreenPic.save(filePathName);
    return 0;
}

通过这两个步骤,就可以抓取指定窗口的图片,并显示保存;也可以抓取正在播放的视频画面;

posted @ 2022-11-23 17:12  一字千金  阅读(1157)  评论(0)    收藏  举报