qt - 下载短文件期间阻止 Qt 应用程序

标签 qt

我正在使用 Qt4 编写一个应用程序。

我需要从给定的 http 地址下载一个非常短的文本文件。

该文件很短,我的应用程序需要该文件才能继续,因此我想确保下载被阻止(或者如果文件未找到/不可用,则在几秒钟后超时)。

我想使用 QHttp::get(),但这是一个非阻塞方法。

我想我可以使用一个线程:我的应用程序会启动它,并等待它完成。该线程将处理下载并在文件下载完毕或超时后退出。

但我无法让它工作:

class JSHttpGetterThread : public QThread
{
  Q_OBJECT

public:
  JSHttpGetterThread(QObject* pParent = NULL);
  ~JSHttpGetterThread();

  virtual void run()
  {
    m_pHttp = new QHttp(this);
    connect(m_pHttp, SIGNAL(requestFinished(int, bool)), this, SLOT(onRequestFinished(int, bool)));

    m_pHttp->setHost("127.0.0.1");
    m_pHttp->get("Foo.txt", &m_GetBuffer);
    exec();
  }

  const QString& getDownloadedFileContent() const
  {
    return m_DownloadedFileContent;
  }

private:
  QHttp* m_pHttp;

  QBuffer m_GetBuffer;
  QString m_DownloadedFileContent;

private slots:
  void onRequestFinished(int Id, bool Error)
  {
    m_DownloadedFileContent = "";
    m_DownloadedFileContent.append(m_GetBuffer.buffer());
  }
};

在创建线程以启动下载的方法中,这是我正在做的事情:

JSHttpGetterThread* pGetter = new JSHttpGetterThread(this);
pGetter->start();
pGetter->wait();

但这不起作用,我的应用程序一直在等待。它看起来很亮,插槽“onRequestFinished”从未被调用。

有什么想法吗?

有更好的方法来完成我想做的事情吗?

最佳答案

您可以进入一个调用processEvents的循环,而不是使用线程:

while (notFinished) {
   qApp->processEvents(QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput);
}

其中 notFinished 是一个可以从 onRequestFinished 插槽设置的标志。

ExcludeUserInput 将确保在等待时忽略 GUI 相关事件。

关于qt - 下载短文件期间阻止 Qt 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/250757/

相关文章:

c++ - 在 QTableView 上绘制 QGraphicsLineItem

c++ - 在什么情况下为 Qt MinGW 或 MSVC 选择什么编译器?

qt - 如何找到Qt输出的消息来源?

c++ - 如何将表示指数形式的十进制数的字符串转换为 Qt 中的 float ?

c++ - 如何判断是否在启用 NumLock 的情况下在小键盘输入上按下了 shift?或者至少获得 NumLock 状态?

c++ - 在构造函数或静态中创建时qtimer崩溃

c++ - 将 focusOutEvent 的函数分配给小部件

c++ - 计算 View 偏移以在鼠标光标的位置放大

qt - 如何从 Qt Creator 的文本字段中获取文本?

c++ - Qt检测计算机何时进入休眠状态?