Archive

Posts Tagged ‘slots’

Qt: (Nearly) synchronous QNetworkAccessManager calls

July 8, 2010 9 comments

The QNetworkAccessManager class is very user-friendly, but it makes asynchronous calls. I was in the need for synchronous calls to handle my HTTP communication, but I did not want the overhead of another thread, so I googled a bit and finally came up with a short call to an event loop that processed the request. Like this:

QNetworkAccessManager * pnam = new QNetworkAccessManager(this);
// the slot was declared at another place
connect(pnam, SIGNAL(finished(QNetworkReply *)), this,
  SLOT(loginFinished(QNetworkReply*)));
QNetworkRequest req(QUrl("http://foo.bar"));
pnam->post(req, postData);

// execute an event loop to process the request (nearly-synchronous)
QEventLoop eventLoop;
// also dispose the event loop after the reply has arrived
connect(pnam, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec();

This way my user-defined slot for the pnam->finished() signal was called immediately, and I could be sure to have the HTTP reply at the end of this code snippet.

Found here: Qt-Interest Mailing List: QNetworkAccessManager and QNetworkReply, synchronous


Flattr this

Advertisements

Qt: Throw exceptions from signals and slots

July 8, 2010 2 comments

By default, you can not throw exceptions from signals and slots:

Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

So, what to do? The answer is simple: Overwrite the function bool QApplication::notify(QObject * receiver, QEvent * event) so that it catches all thrown exceptions. Here is some sample code:

#include <QtGui>
#include <QApplication>
class MyApplication : public QApplication {
public:
  MyApplication(int& argc, char ** argv) :
    QApplication(argc, argv) { }
  virtual ~MyApplication() { }

  // reimplemented from QApplication so we can throw exceptions in slots
  virtual bool notify(QObject * receiver, QEvent * event) {
    try {
      return QApplication::notify(receiver, event);
    } catch(std::exception& e) {
      qCritical() << "Exception thrown:" << e.what();
    }
    return false;
  }

int main(int argc, char *argv[]) {
  MyApplication app(argc, argv);
  // ...
}

Of course, you can also inherit from QCoreApplication to get rid of the QtGui dependency, or display a nice dialog box instead of printing the messages to the console, or…

Found at: Stack Overflow: Qt and error handling strategy


Flattr this

Categories: howto, programming Tags: , , ,