Qt

2016-03-25 27 views
0
numaralı telefondan

numaralı telefondan geri arama gerçekleştirme Qt'de bir çeşit geri arama gerçekleştirmek istiyorum.Qt

İstekte bulunmak için ApiHandler adlı bir sınıfım var. Ve bir işlevi makeRequest'a iletmek için bir yol olmalı ve replyFinished. std :: function/std :: bind kullanarak bir yolu biliyorum. Ama belki Qt kullanarak bunu yapmak için yollar var? Yuvalar? Veya bu durumda std :: function/std :: bind kullanarak hakkında daha ayrıntılı açıklama.

Teşekkürler!

typedef void (*callback)(); 
void ApiHandler::makeRequest(QString method, QMap<QString, QString> parameters, callback) 
{ 
    QUrl url = this->buildCall(method, parameters); 

    connect(this->manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*, callback))); 

    QNetworkRequest request; 
    request.setUrl(url); 
    request.setRawHeader("User-Agent", "Test"); 

    QNetworkReply *reply = this->manager->get(request); 
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); 
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); 
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>))); 
} 
void ApiHandler::replyFinished(QNetworkReply* reply, callback) 
{ 
    qDebug() << "replyFinished" << reply->url(); 
    QJsonDocument j = QJsonDocument::fromJson(reply->readAll()); 
    if (j.isEmpty()) { 
     // throw error 
    } 

    // call the callback with "j" as parameter 
    // callback(j) 

    reply->deleteLater(); 
} 
+0

Kullanım durumu nedir? Std :: işlevine ihtiyacınız var, sadece geri arama derleme zamanında çözülemiyorsa. Tüm geri bildirimleri baforehand biliyorsanız, onları yuva yapın. – xvan

+0

Farklı bir arama yapabilirim, bunun gibi QMap m; m ["user_id"] = this-> settings.value (USER_ID) .toString(); ApiHandler * a = new ApiHandler; a-> makeRequest ("users.isAppUser", m, testCallback); Ve farklı geri bildirimleri iletmem gerekiyor. Örneğin, bunu uygulamadan çağırırsam, bir uyarı görüntülemek için geri arama işlemini geri al, bu pencereden bunu çağırırsam, uygulamayı kullanan herhangi bir kullanıcı için geri aramadan geçiyorum. – Alex

+0

Farklı sinyaller için farklı nesneler kullanın ya da [yuvaları ayırın ve bağlayın] (http://stackoverflow.com/questions/28524925/how-to-disconnect-a-signal-with-a-slot-temporarily-in -qt) bağlamında – xvan

cevap

3

zaten halihazırda Qt türlerini temel alan sinyalleri ve yuvaları ve makeRequest parametreler kullanılarak olduğundan, sadece QObject kaynaklanmaktadır ve bir sinyal içeren İsteği örneğinde geçebileceği.

class Request : public QObject 
{ 
public: 
     QString method(); 
     QMap<QString, QString> parameters(); 

signals: 
    void received(QJsonDocument); 
}; 

replyFinished sonra callback'inde

void ApiHandler::replyFinished(QNetworkReply* reply, Request* request) 

ve eveything hazır olduğunda sadece sinyal ateş bir Request yerine geçebilirdi.

request->received(j); 

ne istersen sadece bağlamak Request geçen önce.

connect(request, &Request::received, [=](QJSonDocument) { 
    // whatever ... 
});