Hallo wie ihr wisst erweitere ich den QTextBrowser um HTTP funktionalität.
Jetzt habe ich dem QTextbrowser eine selbst gemacht MimeSourceFactory übergeben, unteranderem mit der Funktion dataExternal():
Code:
class meinemime : public QObject,public QMimeSourceFactory
{Q_OBJECT
private:
QMap<QString, QString> ext;
QMimeSource* lastmms;
mutable bool bildladen;
QByteArray tempbyte;
//QUrlOperator *m_UrlOperator;
public:
meinemime();
const QMimeSource *data(const QString & abs_or_rel_name) const;
QMimeSource* meinemime::dataInternal(const QString& abs_name, const QMap<QString, QString> &extensions ) const ;
QMimeSource* meinemime::dataExternal(const QString& abs_name, const QMap<QString, QString> &extensions ) const ;
public slots:
void slotGetPageData(const QByteArray &bytesReceived, QNetworkOperation* pOp);
void slotStart(QNetworkOperation* pOp);
void slotFinished(QNetworkOperation* pOp);
};
so bildladen habe ich jetzt mutable gemacht damit aus der dataExternal die bedingung für die Whileschleife (warten auf async funktion) auf true gesetzt werden kann, und vom Slot slotFinished() wieder zurückgesetzt werden kann!
Meine Data external und er eigentliche PROBLEMHERD sieht folgendermaßen aus:
Code:
QMimeSource* meinemime::dataExternal(const QString& abs_name, const QMap<QString, QString> &extensions ) const
{
QMimeSource* r = 0;
qWarning("Custom dataExternal");
QCString mimetype = "application/octet-stream";
QString e = abs_name.right(abs_name.findRev('.'));
if ( extensions.contains( e ) )
mimetype = extensions[e].latin1();
//Bei unbekannten Formaten einfach die endung anhängen
else
mimetype=QCString("image/" + e);
//Bytearray wird in der Asynchronen funktion ermittelt
//und in eine private temp variable gesteckt
//tempbyte.resize(0); (MUSS NOCH GEMACHT WERDEN, WAHRSCHEINLICH TEMOBYTE AUF MUTABLE SETZEN)
qWarning(" >Setze bildlaen=true");
bildladen=true;
if(bildladen==true)
qWarning("FALSCH");
else
qWarning("RIIISCHTISCCCH");
qWarning(" >Op create");
QUrlOperator m_UrlOperator = QUrlOperator("http://www.rygannon.com"); //abs_name weggemacht
qWarning(" >Create Signals");
connect(&m_UrlOperator, SIGNAL(start(QNetworkOperation*)),this,SLOT(slotStart(QNetworkOperation*)));
connect(&m_UrlOperator, SIGNAL(finished(QNetworkOperation*)), this,SLOT(slotFinished(QNetworkOperation*)));
connect(&m_UrlOperator, SIGNAL(data(const QByteArray&, QNetworkOperation*)), this,SLOT(slotGetPageData(const QByteArray&, QNetworkOperation*)));
qWarning(" >call op get");
m_UrlOperator.get();
qWarning(" >while");
if(bildladen==true)
qWarning("FALSCH");
else
qWarning("RIIISCHTISCCCH");
while(bildladen==true){
qWarning(" >WhileCall");
qApp->processEvents();
}
QStoredDrag* sr = new QStoredDrag( mimetype );
sr->setEncodedData( tempbyte );
//MUSS SEIN UM ABZUJIGGERN
r=sr;
if(!r && this !=defaultFactory())
r=(QMimeSource*)defaultFactory()->data(abs_name);
return r;
}
Das problem ist, dass er erst garniht in die schleife kommt, weil scheinbar sofort finished() aufgerufen wird, da ein fehler im QUrlOperator auftritt!
Der Slot...
Code:
void meinemime::slotFinished(QNetworkOperation* pOp)
{
if(!pOp)
return;
if(pOp && pOp->state() == QNetworkProtocol::StFailed)
{
qWarning("Irgendwas in slotFinished() hat DICKST gefailed!!");
// FALIED TO BEKOMMEN DIE SCHEISS SEITE
bildladen=false;
}
else
{
// This is a check on what gets transferred.
// GUT GEMACHT UND KLARGEJIGGERT DEN CONTENT
bildladen=false;
}
}
gibt tatsächlih "Irgendwas in slotFinished() hat DICKST gefailed!!"
aus.
Jetzt meine Frage:
Woran liegt der fehler??
Ich verstehe das nicht, ich habe den Aufruf es QUrlOperators aus einem Beispiel abgeschrieben!
Grüße
Lesezeichen