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; }
通過這兩個步驟,就可以抓取指定窗口的圖片,並顯示保存;也可以抓取正在播放的視頻畫面;