Hatena::ブログ(Diary)

C++でゲームプログラミング

2013-06-14

[]Qt5 を使用して C++ で Webサイトのスクリーンショットを保存する

なんか簡単に出来そうな感じがしたのでやってみました。


[ソース]

#include <QtWidgets/QApplication>
#include <QtGui/QPixmap>
#include <QtWebKitWidgets/QWebView>
#include <QtWebKitWidgets/QWebFrame>
#include <iostream>


int
main(int argc, char* argv[]){
    QApplication app(argc, argv);

    QWebView view;
    view.load(QUrl("https://www.google.co.jp/"));
    view.page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
    view.page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);

    QObject::connect(&view, &QWebView::loadFinished, [&](bool){
        view.resize(view.page()->mainFrame()->contentsSize());
        QPixmap::grabWidget(&view).save("output.png");
        std::cout << "saved" << std::endl;

        app.quit();
    });

    return app.exec();
}

[output.png]

f:id:osyo-manga:20130614204122p:image


QWebView で Webサイトをロードして、ロードが終了したら QPixmap を使用して保存しています。

Qt5 で connect 時にラムダ式が使えるのが便利過ぎる…。

一応 Web サイトのサイズに合わせてリサイズを行なっているんですがこんな感じの書き方でいいんですかね。

だいぶ怪しい…もうちょっとすっきりとした書き方がありそうなだなぁ…。


まぁ要所要所でわからないところがあったので調べるのに時間がかかってしまったけど、最終的には割とすっきりとしたコードになったので満足。

Qt に関して調べてもなかなか欲しい情報にたどり着かなくてつらい…。



[参照]

http://qt-project.org/forums/viewthread/15788