Çarşamba, 29 Mayıs 2013 00:00

Websitesinin ekran görüntüsünü alan Qt program kodu

Yazan 
Öğeyi Oyla
(0 oy)
QUrl sınıfı url'ler ile ilgili işlemler yaparken kullanacağımız fonksiyonları içerir.
QUrl::fromUserInput ile kullanıcının giriş yaptığı yerlerden (örn adres çubuğı) girilen bilginin doğrulanması ve eksik olan protokol bilgisinin otomatik olarak eklenmesi amacıyla kullanılır. Eğer url oluşturacağımız kaynak kodlanmış bir url ise QUrl::fromEncoded fonksiyonunu kullanarak adres bilgisini alabiliriz. QUrl nesnesinin QString ilede oluşturabiliriz. QUrl nesnesi oluşturulduktan sonra url bilgisinin geçerliliğini QUrl::isValid() metodu ile kontrol edebilir eğer bir hata varsa QUrl::errorString() metodu ile bu hatayı öğrenebiliriz.

QUrl url(QString("http://www.google.com.tr"));

QUrl url = QUrl::fromUserInput(string);

QUrl url = QUrl::fromEncoded(byteArray);
Programın ana dosyası.
#include "framecapture.h" // Bu dosya ile websitesi görüntüsünü alan sınıfı ekliyoruz.
#include <iostream>
#include <qtwidgets>

int main(int argc, char * argv[])
{
    // Bu parametre adres çubuğundan veya program parametresi olarak da alınabilirdi
    QString purl("www.google.de");
    QString file("test.png"); // Çıktı Dosyasının Adı

    //Eğer url adresi bir kullanıcı girişi olursa fromUserInput fonksiyonunu
    //kullanırız bu fonksiyon eksik girilen protokol bilgisi gibi alanları doldurur.
    QUrl url = QUrl::fromUserInput(purl);
    QString fileName = file;

    QApplication a(argc, argv);
    FrameCapture capture;
    QObject::connect(&capture, SIGNAL(finished()), QApplication::instance(), SLOT(quit()));
    capture.load(url, fileName);

    return a.exec();
}
Aşağıdaki kodda ise FrameCapture sınıfının başlık dosyası.

#ifndef FRAMECAPTURE_H
#define FRAMECAPTURE_H

#include <qtwebkitwidgets>

class FrameCapture : public QObject
{
    Q_OBJECT

public:
    FrameCapture();
    // url'nin yüklenmesi ve çıktı dosyasının adı belirlenir.
    void load(const QUrl &url, const QString &outputFileName);

signals:
    void finished(); // Websayfasının resminin kopyalaması bittiğinde bu sinyal gerçekleşir.

private slots:
    void printProgress(int percent);
    void saveResult(bool ok);

private:
    QWebPage m_page;
    QString m_fileName;
    int m_percent;
    //Sayfadaki her frame'in resme dönüşmesi için kullanılan üye fonksiyon.
    void saveFrame(QWebFrame *frame);
};

#endif
Aşağıdaki kodda ise FrameCapture sınıfının kaynak dosyasını görüyoruz.
#include "framecapture.h"
#include <iostream>

FrameCapture::FrameCapture(): QObject(), m_percent(0)
{
    connect(&m_page, SIGNAL(loadProgress(int)), this, SLOT(printProgress(int)));
    connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(saveResult(bool)));
}

void FrameCapture::load(const QUrl &url, const QString &outputFileName)
{
    std::cout << "Yükleniyor " << qPrintable(url.toString()) << std::endl;
    m_percent = 0;
    int index = outputFileName.lastIndexOf('.');
    m_fileName = (index == -1) ? outputFileName + ".png" : outputFileName;
    m_page.mainFrame()->load(url);
    m_page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
    m_page.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
    m_page.setViewportSize(QSize(1024, 768));
}

void FrameCapture::printProgress(int percent)
{
    if (m_percent >= percent)
        return;

    while (m_percent++ < percent)
        std::cout << "#" << std::flush;
}

void FrameCapture::saveResult(bool ok)
{
    std::cout << std::endl;

    // Burada hata kontrolü yapılıyor
    if (!ok) {
        std::cerr << "Yükleme hatası " << qPrintable(m_page.mainFrame()->url().toString()) << std::endl;
        emit finished();
        return;
    }

    // Her frame'i ayrı bir resim olarak kaydeder.
    saveFrame(m_page.mainFrame());

    emit finished();
}

void FrameCapture::saveFrame(QWebFrame *frame)
{
    static int frameCounter = 0;

    QString fileName(m_fileName);
    if (frameCounter) {
        int index = m_fileName.lastIndexOf('.');
        fileName = fileName.insert(index, "_frame" + QString::number(frameCounter));
    }

    QImage image(frame->contentsSize(), QImage::Format_ARGB32_Premultiplied);
    image.fill(Qt::transparent);

    QPainter painter(&image);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::TextAntialiasing, true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
    frame->documentElement().render(&painter);
    painter.end();

    image.save(fileName);

    ++frameCounter;
    foreach(QWebFrame *childFrame, frame->childFrames())
        saveFrame(childFrame);
}

Okunma 2146 defa Son Düzenlenme Cuma, 07 Haziran 2013 03:48
Ufuk Yıldırım

Yazılım Geliştirme Uzmanı

Web site: www.ufuk.biz

Yorum Ekle

Gerekli olan (*) işaretli alanlara gerekli bilgileri girdiğinizden emin olun. HTML kod izni yoktur.