Qt5.5制作簡單的屏幕截圖程序


  這一次,來寫一個簡單的屏幕截圖程序。

  屏幕截圖的核心是使用QPixmap::grabWindow()方法。該方法的聲明(參見Qt文檔)如下:

QPixmap QPixmap::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)

  文檔中的解釋是:Creates and returns a pixmap constructed by grabbing the contents of the given window restricted by QRect(x, y, width, height).就是創建並返回一個給定窗口內的指定矩形區域的內容截圖。其中的WId就是給定的窗口ID,要想抓取屏幕(desktop)的內容,就必須傳遞屏幕窗口的ID。這個ID可以使用

QApplication::desktop()->winId()

來獲取。不過在使用的時候需要包含#include <QDesktopWidget>頭文件。

  通過上面的方法可以獲取到屏幕的相應區域的內容截圖(獲取到的是一個QPixmap對象),獲取了這個圖片以后,接下來需要處理三個問題:

(1)截圖時隱藏程序主窗體;

(2)如何使用鼠標來決定要截圖的屏幕區域大小(這一步可以重載鼠標移動事件);

(3)截取圖像的保存以及放入到剪切板中,在之后可以使用Ctrl+V進行粘貼;

 

(1)截圖時隱藏程序主窗體

  這個可以再響應開始截圖的響應信號或事件(如QAction)的響應處理函數中使用主窗體的hide()函數,在截圖完成之后向主窗體發送一個信號,在這個信號的處理函數中調用主窗體的show()函數。

 connect(newpic_,&QAction::triggered,this,&MainWindow::new_pic);
    connect(savepic_,&QAction::triggered,this,&MainWindow::save_pic);
void MainWindow::new_pic()
{
    Dialog dlg;
    connect(&dlg,&Dialog::finish,this,&MainWindow::jietu);
    connect(&dlg,&Dialog::closeF,this,&MainWindow::showF);
    this->hide();
    dlg.exec();
}

void MainWindow::showF()
{
    this->show();
}

(2)使用鼠標來獲取屏幕的指定區域

  使用WINDOWS API開發時,可以程序窗口外的屏幕(desktop)上進行繪制操作,就是獲取屏幕的HDC,還可以獲取鼠標在屏幕上的移動位置,使用這個方法可以非常簡單的在屏幕上繪制要截圖的區域(根據鼠標在屏幕上點擊的位置,在屏幕上繪制一個矩形,來表示要截圖的區域)。

  但是Qt中並沒提供以上的方法,其繪制類QPainter並沒可以獲取屏幕設備的方法,同時也很難獲取鼠標在屏幕上的移動事件。所以需要另辟蹊徑,其實方法很簡單。

  可以創建一個屏幕大小的窗體,在將窗體指定為無邊框、半透明(我測試的時候在全透明的狀況下,好像無法捕捉到鼠標的點擊事件),這樣就可以在這個窗體上繪制截圖區域,以及捕獲鼠標的點擊事件。

    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    QWidget * desktop=QApplication::desktop()->screen();
    resize(desktop->width(),desktop->height());
    this->setMouseTracking(true);

  下面是用來模擬窗體半透明

    int alpha=1;
    QPainter paint(this);
    paint.fillRect(0, 0, width(), height(), QColor(0, 0, 0, alpha));
    QPen pen(Qt::red,2);
    paint.setPen(pen);
    paint.drawRect(pt1.x(), pt1.y(), pt2.x()-pt1.x(), pt2.y()-pt1.y());

(3)截圖的保存和放入剪切板

  保存的時候只需要調用QPixmap對象的save()函數即可。

  對於剪切板的使用需要包含#include <QClipboard>。

    QClipboard * clipborder=QApplication::clipboard();
    clipborder->setPixmap(this->pic);

 

 

以上就是實現一個簡單的截圖程序的方法。下面是程序運行的截圖:

 

 

程序源代碼下載連接:http://pan.baidu.com/s/1gdHd6gj


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM