QT擷取螢幕的實現

pamxy發表於2013-08-06

轉自:http://blog.csdn.net/dansin/article/details/259990

作業系統:ARM-LINUX
圖形使用者介面:Qtopia
圖形開發庫:QT

Qtopia是Trolltech公司面向嵌入式Linux的綜合應用平臺。Qtopia包含完整的應用層、靈活的使用者介面、視窗操作、應用程式啟動程式以及開發框架。另外Qtopia基於QT/Embedded的C++類庫,擁有統一的應用程式程式設計介面,支援多工管理,實用性強。

Qt是Trolltech公司開發的一個多平臺的C++圖形使用者介面應用程式框架,它提供給應用程式開發者建立藝術級的圖形使用者介面所需的所用功能。Qt是完全物件導向,很容易進行擴充套件,並且允許真正的元件程式設計。Qt同時也是流行的Linux桌面環境KDE 的基礎。 

本文闡述了一個在Qtopia下擷取螢幕的方法,實際上Qtopia和QT都支援幀緩衝技術,我們可以將幀緩衝的資料讀出來即為螢幕資料。但是這種方法需要對裝置驅動的瞭解,而且實現起來不那麼方便。這裡介紹利用QT庫中自帶的grabWidget與grabWindow函式擷取螢幕的方法。
兩個函式的原型如下:
QPixmap QPixmap::grabWindow ( WId window, int x=0, int y=0, int w=-1, int h=-1 )
WId表示被擷取視窗的ID號;
x,y表示擷取範圍的起始作標;
w,h分別表示擷取範圍的寬度和高度,如果為-1,則表示全部擷取。

QPixmap QPixmap::grabWidget (  QWidget  * widget, int x=0, int y=0, int w=-1, int h=-1 )
widget表示被擷取視窗的畫布部分,其餘引數同grabWindow

下面這段程式碼實現了當前整個視窗的擷取。
    QPixmap pixmap;   
    //QT庫中的圖形類,可以處理QT支援的所有圖形型別,如JPG,BMP等
    QPixmap pix;

    pix=pixmap.grabWindow(this->winId(),0,0,-1,-1);     
    //this->winId()為獲得當前視窗ID
    if(pix.isNull())
    {
        QMessageBox::information(this,"error","grab Screen failed",QMessageBox::Ok);
    }
    else
    {
        if(pix.save( "/tmp/grab.bmp", "BMP" )==false)
        {
            QMessageBox::information(this,"right","save error",QMessageBox::Ok);
        }
        else
            QMessageBox::information(this,"Grab","bitmap saved as /tmp/grab.bmp",QMessageBox::Ok);
    }

將grabWindow改為grabWidget即可實現畫布資料的採集。


相關文章