2016-01-07 3 views
0

Я пытаюсь использовать QNetworkaccessmanager, который я получаю, но только когда я использую его базовый основной класс. Это не работает ни с одним другим классом, как mainwindow.QNetworkAccessManager работает только с основной функцией приложения

main.cpp

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    Updater up; 
    up.Update(); 

    return a.exec(); 
} 

updater.cpp

#include "Updater.h" 


Updater::Updater(QObject *parent) : 
    QObject(parent) 
{ 
    manager = new QNetworkAccessManager(this); 

    connect(manager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(replyFinished(QNetworkReply*))); 
} 

void Updater::Update() 
{ 
    manager->get(QNetworkRequest(QUrl(//url))); 
} 

void Updater::replyFinished (QNetworkReply *reply) 
{ 
    if(reply->error()) 
    { 
     qDebug() << "ERROR!"; 
     qDebug() << reply->errorString(); 
    } 
    else 
    { 
     QString result = (QString)reply->readAll(); 

     //foo(result) 
    } 

    reply->deleteLater(); 
} 

ответ

0

Существует ряд способов, вы можете использовать экземпляр класса через код приложения и, например, в одноплодной схеме:

// TODO: Provide Updater* updater() in the header file 
// and use it like updater()->Update(); wherever you like 
// in your application class' objects 

static Updater* s_updater; 

Updater* updater() 
{ 
    return s_updater; 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    Updater up; 
    s_updater = &up; 

    // do this from somewhere else 
    // up.Update(); 

    return a.exec(); 
} 

Проблема с этим подходом заключается в том, как доставить результаты определенному потребителю, но это разделитель задайте вопрос, и даже не ясно, хотите ли вы этого или как он работает, так это просто, но этот объект должен быть доступен для вашего кода приложения.

Кроме того, некоторые разработчики программного обеспечения не любят одноэлементный шаблон (есть причины для этого, хотя, возможно, это так плохо), и вы можете просто создать объект динамически с помощью нового оператора, но убедитесь, что вы правильно управляете его жизненным циклом. Существует также несколько способов сделать это в Qt: передача родительского объекта в конструктор класса QObject, QScopedPointer, QSharedPointer и т. Д.