Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Tom_as 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:
#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 zbytocny
signals:
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.
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().
-
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();
}