ZBLOG

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

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

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

示例代码

#include <QApplication>
#include <QMainWindow>
#include <QDialog>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QProgressBar>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class DownloadWidget : public QWidget {
    Q_OBJECT

public:
    DownloadWidget(const QUrl &url, QWidget *parent = nullptr) : QWidget(parent), manager(new QNetworkAccessManager(this)) {
        // 布局
        QVBoxLayout *layout = new QVBoxLayout(this);
        
        QLabel *label = new QLabel("Downloading file...", this);
        layout->addWidget(label);

        progressBar = new QProgressBar(this);
        progressBar->setRange(0, 100);
        layout->addWidget(progressBar);

        QPushButton *cancelButton = new QPushButton("Cancel", this);
        layout->addWidget(cancelButton);

        connect(cancelButton, &QPushButton::clicked, this, &DownloadWidget::cancelDownload);

        // 开始下载
        startDownload(url);
    }

signals:
    void downloadFinished();

private slots:
    void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) {
        if (bytesTotal > 0) {
            int progress = static_cast<int>((bytesReceived * 100) / bytesTotal);
            progressBar->setValue(progress);
        }
    }

    void onDownloadFinished() {
        // 清理和关闭
        emit downloadFinished();
    }

private:
    void startDownload(const QUrl &url) {
        QNetworkRequest request(url);
        reply = manager->get(request);

        connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWidget::onDownloadProgress);
        connect(reply, &QNetworkReply::finished, this, &DownloadWidget::onDownloadFinished);
    }

    void cancelDownload() {
        if (reply) {
            reply->abort(); // 取消下载
            emit downloadFinished(); // 发出信号以关闭 dialog
        }
    }

private:
    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QProgressBar *progressBar;
};

class MainWindow : public QMainWindow {
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        
      // 创建按钮来启动下载
      QPushButton* downloadButton = new QPushButton("Start Download", this); 
      setCentralWidget(downloadButton); 

      connect(downloadButton,&QPushButton::clicked,this,&MainWindow::startDownloading); 
   }

private slots:
   void startDownloading() {      
       // 创建并显示对话框       
       QString urlString = "http://example.com/file.zip"; // 替换为您的 URL
       DownloadWidget *downloadWidget = new DownloadWidget(QUrl(urlString));
       
       // 创建并设置对话框        
       QDialog *dialog = new QDialog(this);        
       dialog->setWindowTitle("File Download");
       
       // 设置布局    
       QVBoxLayout *layout = new QVBoxLayout(dialog);        
       layout->addWidget(downloadWidget); 
        
       dialog->setLayout(layout);     
       
       // 当下载完成时关闭对话框      
       connect(downloadWidget, &DownloadWidget::downloadFinished, dialog, &QDialog::accept);      
       
       dialog->exec(); // 显示对话框
   }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    return a.exec();
}

#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

注册

已经有帐号?