ZBLOG

在主窗口创建一个QDialog,嵌入一个http下载的widget,下载结束后关闭widget和QDialog

要在主窗口中创建一个 QDialog,并嵌入一个用于 HTTP 下载的 widget,您可以使用 Qt 的 QNetworkAccessManagerQProgressBar 来实现文件下载,并在下载完成后关闭对话框和 widget。

以下是一个简单示例,演示了如何创建这样的结构:

示例代码

  1. #include <QApplication>
  2. #include <QMainWindow>
  3. #include <QDialog>
  4. #include <QVBoxLayout>
  5. #include <QLabel>
  6. #include <QPushButton>
  7. #include <QProgressBar>
  8. #include <QNetworkAccessManager>
  9. #include <QNetworkReply>
  10. class DownloadWidget : public QWidget {
  11. Q_OBJECT
  12. public:
  13. DownloadWidget(const QUrl &url, QWidget *parent = nullptr) : QWidget(parent), manager(new QNetworkAccessManager(this)) {
  14. // 布局
  15. QVBoxLayout *layout = new QVBoxLayout(this);
  16. QLabel *label = new QLabel("Downloading file...", this);
  17. layout->addWidget(label);
  18. progressBar = new QProgressBar(this);
  19. progressBar->setRange(0, 100);
  20. layout->addWidget(progressBar);
  21. QPushButton *cancelButton = new QPushButton("Cancel", this);
  22. layout->addWidget(cancelButton);
  23. connect(cancelButton, &QPushButton::clicked, this, &DownloadWidget::cancelDownload);
  24. // 开始下载
  25. startDownload(url);
  26. }
  27. signals:
  28. void downloadFinished();
  29. private slots:
  30. void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) {
  31. if (bytesTotal > 0) {
  32. int progress = static_cast<int>((bytesReceived * 100) / bytesTotal);
  33. progressBar->setValue(progress);
  34. }
  35. }
  36. void onDownloadFinished() {
  37. // 清理和关闭
  38. emit downloadFinished();
  39. }
  40. private:
  41. void startDownload(const QUrl &url) {
  42. QNetworkRequest request(url);
  43. reply = manager->get(request);
  44. connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWidget::onDownloadProgress);
  45. connect(reply, &QNetworkReply::finished, this, &DownloadWidget::onDownloadFinished);
  46. }
  47. void cancelDownload() {
  48. if (reply) {
  49. reply->abort(); // 取消下载
  50. emit downloadFinished(); // 发出信号以关闭 dialog
  51. }
  52. }
  53. private:
  54. QNetworkAccessManager *manager;
  55. QNetworkReply *reply;
  56. QProgressBar *progressBar;
  57. };
  58. class MainWindow : public QMainWindow {
  59. public:
  60. MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
  61. // 创建按钮来启动下载
  62. QPushButton* downloadButton = new QPushButton("Start Download", this);
  63. setCentralWidget(downloadButton);
  64. connect(downloadButton,&QPushButton::clicked,this,&MainWindow::startDownloading);
  65. }
  66. private slots:
  67. void startDownloading() {
  68. // 创建并显示对话框
  69. QString urlString = "http://example.com/file.zip"; // 替换为您的 URL
  70. DownloadWidget *downloadWidget = new DownloadWidget(QUrl(urlString));
  71. // 创建并设置对话框
  72. QDialog *dialog = new QDialog(this);
  73. dialog->setWindowTitle("File Download");
  74. // 设置布局
  75. QVBoxLayout *layout = new QVBoxLayout(dialog);
  76. layout->addWidget(downloadWidget);
  77. dialog->setLayout(layout);
  78. // 当下载完成时关闭对话框
  79. connect(downloadWidget, &DownloadWidget::downloadFinished, dialog, &QDialog::accept);
  80. dialog->exec(); // 显示对话框
  81. }
  82. };
  83. int main(int argc, char *argv[]) {
  84. QApplication a(argc, argv);
  85. MainWindow w;
  86. w.show();
  87. return a.exec();
  88. }
  89. #include "main.moc"

说明:

  1. DownloadWidget:这是自定义的小部件,用于处理 HTTP 下载。它包含一个进度条和一个取消按钮。

    • 使用 QNetworkAccessManager 执行文件下载。
    • onDownloadProgress() 中更新进度条。
    • 在下载完成后发出 downloadFinished() 信号。
  2. MainWindow:主窗口包含一个按钮,可以启动文件下载过程。

    • 当点击按钮时,会创建并显示一个带有 DownloadWidgetQDialog 对话框。
  3. 信号与槽:当下载完成或用户点击取消按钮时,通过信号与槽机制关闭对话框。

使用方法:

将上述代码放入您的 Qt 项目中运行。点击“Start Download”按钮,将打开一个新的对话框,其中包括用于显示当前下载状态的 widget。在实际应用中,请将 "http://example.com/file.zip" 替换为您需要下载的文件的 URL。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20092

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?