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); }; #endifAş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); }