Qt事件循环处理
Qt事件循环处理
Qt事件循环依赖于 QCoreAppcation::exec(). 在exec()没调用前,所有的消息都是不会被传递的。
这会造成什么现象呢?
- 网络请求不可用
QNetworkAccessManager::get() 不可用,即你调用了 get() 无法收到 finished() 信号
QTcpSocket::connectToHost() 不可用,即你调用了 connectToHost() 无法连接到主机
调用 QTcpSocket::state() 你将发现 QTcpSocket 一直处在 QAbstractSocket::ConnectingState状态
要解决这个问题,就需要将以上事件处理移到QCoreAppcation::exec() 之后处理。
例如:
利用定时器解决这个问题。
main.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::auto_ptr<CInitApp> autoPtr(new CInitApp);
return a.exec();
}
InitApp.h
#ifndef INITAPP_H
#define INITAPP_H
#include <QObject>
class CInitApp : public QObject
{
Q_OBJECT
public:
explicit CInitApp(QObject* parent = 0);
private slots:
void onInitApp();
};
#endif // INITAPP_H
InitApp.cpp
#include "InitApp.h"
#include <QTimer>
CInitApp::CInitApp(QObject* parent) : QObject(parent)
, m_pCoordsRecv(NULL)
{
//为了在启动事件循环后,可以正常执行初始化流程
QTimer::singleShot(0, this, SLOT(onInitApp()));
}
void CInitApp::onInitApp()
{
/* 此槽函数中实现各种初始化操作 */
}