Ahojte,
zkouším si co umí Qt s webkitem a moc nechápu proč nefunguje následující kód:
#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?
zkuste ukladat az potom co je stranka nactena (jako reakci na onLoaded nebo podobny signal)
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.
Prave to je ten problem. Nepovedlo se me ten signal zprovoznit.
Tak jsem se snažil to předělat do této podoby:
#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:
#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:
uDebats neco;
neco.LoadPage();
Tak program spadne. Nevíte čím to je? Bug v Qt?
tento signal je zbytocnysignals:
void loadFinished();
a padne to pretoze tam nie je vytvorenie QWebView a este pripojenie signala na signal je sice validne ale potrebujes
connect (webpage , SIGNAL(loadFinished()) , SLOT(SavePage()));
Padani opraveno:
webpage = new QWebView;
Držel jsem se tvých rad a udělal jsem.
Citacewebpage = 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().
Dneska se s tim uz pěkně dlouho morduju a nechápu proč to nefunguje:
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?
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
treba zamenit QApplication za QCoreApplication ak nie je GUI. potom treba zavolat QCoreApplication::exit(); pre skoncenie aplikacie.pod
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
Tohle funguje
#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;
}
int main(int argc, char* argv[])
{
QApplication myApp(argc, argv);
PagePrinter ppr;
ppr.getPage("http://www.ihned.cz");
return myApp.exec();
}