Anzeige:
Ergebnis 1 bis 5 von 5

Thema: QUrlOperator, nur finished Signal!Immer failed() ??

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.06.2005
    Beiträge
    24

    QUrlOperator nur finished() Signal! Schlägt immer Fehl!(QNetworkProtocol::StFailed)

    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
    Geändert von cagara (22-06-2005 um 11:44 Uhr) Grund: QTextBrowser HTTP Erweiterung

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    qInitNetworkProtocols aufgerufen?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.06.2005
    Beiträge
    24
    Hey, danke es klappt jetzt etwas

    leidergottes bleibt das Programm hängen, bzw beeinträchtigt das gesamte System.

    Liegt wohl an der While-Schleife.
    Gibt es da keine effektiveren methoden?

  4. #4
    Registrierter Benutzer
    Registriert seit
    13.06.2005
    Beiträge
    24
    Oh, ich muss sagen dass doch nichts Passiert, er bleibt nur hängen,
    laut Routerstats kommt kein netzwerk verkehr zu stande!

    Vielleicht WEIL er hängenbleibt?
    hmm eigenartig!

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Was sagt die NetworkOperation die du als Rückgabewert von get() bekommst?

    Eventuell ist es auch leichter QHttp direkt zu benutzen und als Ziel IODevice einen QBuffer einzusetzen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •