Qt a WebKit

Tom_as

Qt a WebKit
« kdy: 24. 09. 2012, 13:57:47 »
Ahojte,

zkouším si co umí Qt s webkitem a moc nechápu proč nefunguje následující kód:
Kód: [Vybrat]
#include <iostream>

#include <QtGui>

#include <QtWebKit>
#include <QDebug>
#include <QObject>

int Save(){

    QWebView *webpage = new QWebView;
    webpage->load(QUrl("http://idnes.cz"));


    QPrinter *printer = new QPrinter(QPrinter::HighResolution);
    printer->setPageSize(QPrinter::A4);
    printer->setOutputFormat(QPrinter::PdfFormat);
    printer->setOutputFileName("file.pdf");


    webpage->print(printer);

    delete webpage;

    return 0;

}

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

    Save();
   
    return a.exec();
}

Podle všeho se stránka loadne a když bych dal .show tak se i zobrazí ale když jí ukládám do PDF tak se uloží jen 2kb PDF. Nevěděl by někdo prosím?


joe

Re:Qt a WebKit
« Odpověď #1 kdy: 24. 09. 2012, 15:18:31 »
zkuste ukladat az potom co je stranka nactena (jako reakci na onLoaded nebo podobny signal)

Sten

Re:Qt a WebKit
« Odpověď #2 kdy: 24. 09. 2012, 15:25:39 »
Rychlý pohled do dokumentace odhalí, že load je asynchronní, tj. pouze instruuje QWebView, aby začalo stahovat, ale nečeká, až se to stáhne. Ten tisk je potřeba provádět na signál loadFinished.

Tom_as

Re:Qt a WebKit
« Odpověď #3 kdy: 24. 09. 2012, 21:47:10 »
Prave to je ten problem. Nepovedlo se me ten signal zprovoznit.

Tom_as

Re:Qt a WebKit
« Odpověď #4 kdy: 25. 09. 2012, 09:02:11 »
Tak jsem se snažil to předělat do této podoby:

Kód: [Vybrat]
#include <iostream>
#include <QtGui>
#include <QtWebKit>
#include <QDebug>
#include <main.h>


uDebats::uDebats(): QObject()
{

}

void uDebats::LoadPage(){

    webpage->load(QUrl("http://idnes.cz"));

    QObject::connect (webpage , SIGNAL(loadFinished()) , SLOT(loadFinished()));

    //return 0;

}

void uDebats::SavePage(){

    QPrinter *printer = new QPrinter(QPrinter::HighResolution);
    printer->setPageSize(QPrinter::A4);
    printer->setOutputFormat(QPrinter::PdfFormat);
    printer->setOutputFileName("file.pdf");


    webpage->print(printer);

    delete webpage;

    //return 0;

}

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

    uDebats neco;

    neco.LoadPage();

    return a.exec();
}

Hlavicka je:
Kód: [Vybrat]
#ifndef MAIN_H
#define MAIN_H

#include <QWebView>

class uDebats : public QObject
{
    Q_OBJECT

public:
    void LoadPage();
    uDebats();

signals:
    void loadFinished();

private slots:
    void SavePage();

private:
    QWebView *webpage;
};

#endif // MAIN_H


Problém je v tom že jak se začne volat:

Kód: [Vybrat]
uDebats neco;

neco.LoadPage();

Tak program spadne. Nevíte čím to je? Bug v Qt?


nou

Re:Qt a WebKit
« Odpověď #5 kdy: 25. 09. 2012, 09:36:58 »
tento signal je zbytocny
Kód: [Vybrat]
signals:
    void loadFinished();

a padne to pretoze tam nie je vytvorenie QWebView a este pripojenie signala na signal je sice validne ale potrebujes
Kód: [Vybrat]
connect (webpage , SIGNAL(loadFinished()) , SLOT(SavePage()));

Tom_as

Re:Qt a WebKit
« Odpověď #6 kdy: 25. 09. 2012, 09:37:15 »
Padani opraveno:

webpage = new QWebView;

Tom_as

Re:Qt a WebKit
« Odpověď #7 kdy: 25. 09. 2012, 09:52:17 »
Držel jsem se tvých rad a udělal jsem.

Citace
    webpage = new QWebView;
    QObject::connect (webpage , SIGNAL(loadFinished(bool)) , SLOT(SavePage()));
    webpage->load(QUrl("http://idnes.cz"));

Chybělo tam ještě bool jinak to nešlo zkompilovat. Problém je v tom že vše proběhne až na zavoláni SavePage().

Tom_as

Re:Qt a WebKit
« Odpověď #8 kdy: 25. 09. 2012, 16:10:45 »
Dneska se s tim uz pěkně dlouho morduju a nechápu proč to nefunguje:

Kód: [Vybrat]
uDebats::uDebats(QString(argCommand), QString(arg))
{

    //std::cout << "mServer is running." << std::endl;
    //LoadPage(argCommand, arg);
    LoadPage();


}

void uDebats::LoadPage(){

    webpage = new QWebView();
    connect (webpage, SIGNAL(loadFinished(bool)), this, SLOT(SavePage()));
    webpage->load(QUrl("http://fgdfgdfidnes.jp"));

}

void uDebats::SavePage(){

    std::cout << "Run";

Žádná chyba ani warning se nevygenerovala a přitom connect nespustí SavePage. Napadá mě zda loadFinished je zprávná volba. Neřešil to někdo prosím?

Sten

Re:Qt a WebKit
« Odpověď #9 kdy: 25. 09. 2012, 17:25:37 »
AFAIK je problém v tom, že ta aplikace (QApplication::exec) skončí dříve, než se ta stránka načte, protože jste nijak QApplication neřekl, na co má čekat. Ale už jsem v Qt neprogramoval dost dlouho, tak už si nepamatuju, jak se to dělalo

nou

Re:Qt a WebKit
« Odpověď #10 kdy: 25. 09. 2012, 22:35:50 »
treba zamenit QApplication za QCoreApplication ak nie je GUI. potom treba zavolat QCoreApplication::exit(); pre skoncenie aplikacie.pod

wix

Re:Qt a WebKit
« Odpověď #11 kdy: 26. 09. 2012, 07:34:47 »
to co chces tisknout napred preved na string.po nacteni QWebView (loadFinished)..QString str = webpage->toPlainText(); a pak s tim jako se stringem pracuj.to me tak ted napadlo.nemam cas takze netusim jestli to pomuze

Neviditelný

Re:Qt a WebKit
« Odpověď #12 kdy: 26. 09. 2012, 14:19:20 »
Tohle funguje
Kód: [Vybrat]
#include "pageprinter.h"

PagePrinter::PagePrinter()
{
}

void PagePrinter::getPage(QString link)
{
    m_webpage = new QWebView();
    connect(m_webpage, SIGNAL(loadFinished(bool)), this, SLOT(savePage()));

    m_webpage->load(QUrl(link));
}

void PagePrinter::savePage()
{
    QPrinter *printer = new QPrinter(QPrinter::HighResolution);
    printer->setPageSize(QPrinter::A4);
    printer->setOutputFormat(QPrinter::PdfFormat);
    printer->setOutputFileName("./file.pdf");

    m_webpage->print(printer);

    delete printer;
}

PagePrinter::~PagePrinter()
{
    delete m_webpage;
}

Kód: [Vybrat]
int main(int argc, char* argv[])
{
    QApplication myApp(argc, argv);

    PagePrinter ppr;
    ppr.getPage("http://www.ihned.cz");

    return myApp.exec();
}