Seite 1 von 1
QHttp: einfacher download einer php seite?
Verfasst: 16. November 2008 15:34
von wayneos
hallo,
hab mich durch die ganzen examples von qt gequält aber leider bin ich immer noch nicht wirklich schlau draus geworden.
ich will mit qhttp einfach eine php seite von einem server runterladen und dann den inhalt als string zur verfügung haben. die datei muss nicht zwingend gespeichert werden, bzw wieder gelöscht werden wenn der String mit dem inhalt vorhanden ist.
wie müsste das in der einfachsten ausführung (ohne fehlermeldungen) aussehen?
vielen dank im vorraus
Verfasst: 16. November 2008 19:39
von RD1978
Hallo, wie genau stellst Du Dir das vor?
Willst Du den PHP-Quelltext haben oder die HTML-Ausgabe?
Den PHP-Quelltext wirst Du mit QHttp nicht kriegen. Die HTML-Ausgabe kannst Du mit der Methode readAll() holen nachdem das Signal done() gesendet wurde.
Gruß RD1978
Verfasst: 16. November 2008 19:39
von Christian81
Code: Alles auswählen
QBuffer m_buf;
QHttp m_http;
int m_idGet;
...
m_buf.open(QBuffer::ReadWrite);
m_http.setHost("www.trolltech.com");
m_idGet = m_http.get(QUrl::toPercentEncoding("/index.html"), &m_buf);
Und dann auf requestFinished() mit m_idGet warten.
Verfasst: 17. November 2008 00:47
von wayneos
danke für die antworten.
doch leider steig ich da gar nicht durch! was ich genau machen will ist: mit QHttp eine php datei mit post-data aufrufen und das ergebnis(den quelltext) wieder in einem string zu haben:
in etwa so:
Code: Alles auswählen
QBuffer buff;
QHttp http;
int id;
QString host = "http://blabla.../";
QString data = "fx=test&pg=2";
buff.open (QBuffer::ReadWrite);
http.setHost (host);
id = http.post (QUrl::toPercentEncoding ("/output.php"), data, &buff);
QString new = buff.readall ();
aber irgendwie will das nicht so wirklich! die ausgabe der php seite ist nur ein text mit 10 buchstaben. was mach ich falsch?
Verfasst: 17. November 2008 06:28
von Christian81
Man sollte schon warten bis das requestFinished() - Signal kommt...

Verfasst: 18. November 2008 16:18
von wayneos
versteh ich dich richtig? der int gibt das signal zurück? ausserdem bekomm ich für folgende zeile:
Code: Alles auswählen
id = http.post (QUrl::toPercentEncoding ("/output.php"), data, &buff);
folgende fehlermeldung:
Code: Alles auswählen
no matching function for call to `QHttp::post(QByteArray, QString&, QBuffer**)
was stimmt daran nicht?
Verfasst: 18. November 2008 17:26
von Christian81
wayneos hat geschrieben:versteh ich dich richtig? der int gibt das signal zurück?
Ist es so schwer ne Doku zu lesen? Da steht doch nun alles!
folgende fehlermeldung:
wayneos hat geschrieben:
Code: Alles auswählen
no matching function for call to `QHttp::post(QByteArray, QString&, QBuffer**)
was stimmt daran nicht?
m_buf ist bei Dir ein Pointer, also ist &m_buf ein Pointer auf einen Pointer. C Basics würde ich sagen.
Verfasst: 18. November 2008 17:38
von wayneos
ok merci! aber auch ohne das & zeichen kommt der fehler!
ps...das & ist aus deinem ersten beispiel übernommen!
Verfasst: 18. November 2008 17:50
von VuuRWerK
wayneos hat geschrieben:ok merci! aber auch ohne das & zeichen kommt der fehler!
ps...das & ist aus deinem ersten beispiel übernommen!
Da ist m_buf aber kein pointer auf QBuffer sondern ein Objekt. Das & vor einem Objekt bewirkt das übergeben des Pointers auf das Objekt. Aber wie schon gesagt wurde sind das Basics die man vorher wissen sollte bevor man Qt verwendet
Gut Schuß
Christian

Verfasst: 18. November 2008 18:24
von wayneos
ja das verstehe ich schon! aber kannst du mir den uterschied zwischen seinem ersten beispiel und meinem antwortpost darauf erklären
ich versteh nicht wieso es bei mir kein Objekt ist?
Verfasst: 18. November 2008 19:25
von wayneos
ok hab nun folgendes gebastelt.
infotabelle.h
Code: Alles auswählen
#ifndef INFOTABELLE_H
#define INFOTABELLE_H
#include <QWidget>
#include <QComboBox>
#include <QUrl>
#include <QBuffer>
class start : public QWidget {
Q_OBJECT
public:
start (QWidget *parent = 0);
QComboBox *cobx;
QBuffer *buff;
public slots:
void refresh ();
void roger ();
signals:
void changed (QString);
};
#endif
infotabelle.cpp
Code: Alles auswählen
#include "infotabelle.h"
#include <QApplication>
#include <QHttp>
#include <QHttpRequestHeader>
start::start (QWidget *parent) : QWidget (parent) {
cobx = new QComboBox (this);
}
void start::refresh () {
QString host = "http://...";
QString data = "fx=start&lh=";
buff = new QBuffer;
buff -> open (QBuffer::ReadWrite);
QHttp *http;
QHttpRequestHeader header ("POST", "/output.php");
header.setValue("Host", host);
http -> setHost (host);
header.setValue ("User-Agent", "User Agent");
header.setContentType ("application/x-www-form-urlencoded");
http -> request (header, data.toUtf8 (), buff);
connect (http, SIGNAL (requestFinished ()), this, SLOT (roger ()));
}
void start::roger () {
QString output;
output = buff -> readAll ();
QStringList list;
list = output.split("--");
int l = list.size ();
for (int i = 0; i < l; i++) {
cobx -> addItem (tr ("1%").arg (list.at (i)));
}
}
es lässt sich ohne fehler compilen aber sobald dann das programm refresh () ausführt kommt ein appcrash des moduls qtnetwork4.dll..
was soll das bedeuten?
Verfasst: 18. November 2008 20:36
von upsala
Dann schau dir deinen Quellcode nochmal genau(!) an, oder verwende einen Debugger.
Verfasst: 19. November 2008 17:08
von wayneos
das hab ich jetzt schon des öfteren! doch leider komm ich nicht drauf wie ich das realisieren kann. kannst du mir nicht einfach sagen wo der fehler ist, bzw wie ich es zum laufen bekomme?
Verfasst: 19. November 2008 17:20
von Christian81
Tja das kommt davon wenn man mit Pointern arbeitet wo es total unnötig ist - uninitialiserte Pointer und Memleaks...