C++ -QT框架/不能唤起方法

C++ -QT框架/不能唤起方法,c++,qt,file,download,qt5,C++,Qt,File,Download,Qt5,各位。首先我想为我的英语不好道歉。这是我个人项目的代码,我需要帮助。执行时的当前代码应下载此视频-,但不起作用。只有在输入以下代码时,才会下载视频 //main.cpp int main (int argc, char * argv []) { QApplication a (argc, argv); MainWindow w; w.show (); QtDownload dl; dl.setTarget ( "http://media09.vbox7.

各位。首先我想为我的英语不好道歉。这是我个人项目的代码,我需要帮助。执行时的当前代码应下载此视频-,但不起作用。只有在输入以下代码时,才会下载视频

//main.cpp

int main (int argc, char * argv [])
{
    QApplication a (argc, argv);
    MainWindow w;
    w.show ();

    QtDownload dl;
    dl.setTarget ( "http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl.download ();
      // Quit when the download is done.
    // QObject :: connect (& dl, SIGNAL (done ()), & app, SLOT (quit ()));
    return a.exec ();
}
我想在方法主窗口中运行-示例: //mainwindow.cpp

MainWindow :: MainWindow (QWidget * parent):
    QMainWindow (parent),
    ui (new Ui :: MainWindow)
{

    QtDownload dl;
    dl.setTarget ( "http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl.download ();
     // Quit when the download is done.
    // QObject :: connect (& dl, SIGNAL (done ()), & app, SLOT (quit ()));
........
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QFile>
#include <QDebug>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkReply>
#include <QByteArray>
#include <QObject>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{


    ui->setupUi(this);


    //  QCoreApplication app(argc, argv);
    QtDownload dl;

    dl.setTarget("http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl.download();
      //quit when the download is done.
    //  QObject::connect(&dl, SIGNAL(done()), &app, SLOT(quit()));

}


MainWindow::~MainWindow()
{
    delete ui;
}


QtDownload::QtDownload() : QObject(0) {
    QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(downloadFinished(QNetworkReply*)));
}




void QtDownload::setTarget(const QString &t) {
    this->target = t;
}

void QtDownload::downloadFinished(QNetworkReply *data) {
    QFile localFile("C:/downloadedfile.mp4");
    if (!localFile.open(QIODevice::WriteOnly))
        return;
    const QByteArray sdata = data->readAll();
    localFile.write(sdata);
    qDebug() << sdata;
    localFile.close();

    emit done();
}

void QtDownload::download() {
    QUrl url = QUrl::fromEncoded(this->target.toLocal8Bit());
    QNetworkRequest request(url);
    QObject::connect(manager.get(request), SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));

}

void QtDownload::downloadProgress(qint64 recieved, qint64 total) {
    qDebug() << recieved << total;
}
这是程序的当前代码

//下载程序

#-------------------------------------------------
#
# Project created by QtCreator 2017-01-12T15:22:17
#
#-------------------------------------------------

QT       += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = downloader
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
//主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QObject>
#include <QString>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};


class QtDownload : public QObject {
    Q_OBJECT
public:
    explicit QtDownload();
    QNetworkAccessManager manager;
    QString target;

    void setTarget(const QString& t);

private:


signals:
    void done();

public slots:
    void download();
    void downloadFinished(QNetworkReply* data);
    void downloadProgress(qint64 recieved, qint64 total);
};

#endif // MAINWINDOW_H
//main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QtCore>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
//mainwindow.cpp

MainWindow :: MainWindow (QWidget * parent):
    QMainWindow (parent),
    ui (new Ui :: MainWindow)
{

    QtDownload dl;
    dl.setTarget ( "http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl.download ();
     // Quit when the download is done.
    // QObject :: connect (& dl, SIGNAL (done ()), & app, SLOT (quit ()));
........
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QFile>
#include <QDebug>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkReply>
#include <QByteArray>
#include <QObject>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{


    ui->setupUi(this);


    //  QCoreApplication app(argc, argv);
    QtDownload dl;

    dl.setTarget("http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl.download();
      //quit when the download is done.
    //  QObject::connect(&dl, SIGNAL(done()), &app, SLOT(quit()));

}


MainWindow::~MainWindow()
{
    delete ui;
}


QtDownload::QtDownload() : QObject(0) {
    QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(downloadFinished(QNetworkReply*)));
}




void QtDownload::setTarget(const QString &t) {
    this->target = t;
}

void QtDownload::downloadFinished(QNetworkReply *data) {
    QFile localFile("C:/downloadedfile.mp4");
    if (!localFile.open(QIODevice::WriteOnly))
        return;
    const QByteArray sdata = data->readAll();
    localFile.write(sdata);
    qDebug() << sdata;
    localFile.close();

    emit done();
}

void QtDownload::download() {
    QUrl url = QUrl::fromEncoded(this->target.toLocal8Bit());
    QNetworkRequest request(url);
    QObject::connect(manager.get(request), SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));

}

void QtDownload::downloadProgress(qint64 recieved, qint64 total) {
    qDebug() << recieved << total;
}

我已经尝试了你的代码,我遇到了与你报告相同的问题,只是将对象的创建更改为指针并神奇地排列,我仍然不理解出错的原因,我将继续搜索原因

你必须:

...
ui->setupUi(this);
QtDownload *dl =  new QtDownload();
dl->setTarget( "http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
dl->download();
...

所以。。如果要在QmainWindow上运行下载,则对象QtDownload dl应该是MainWindow的指针属性,否则它不会被销毁,除非dl作为QObject,hasMainWindow`作为父对象

在这种情况下,将其运行到main函数不起作用,因为调用exec时应用程序将运行,因此下载

所以会是这样的:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    // Delete the `dl` object
    ~MainWindow() { delete dl; }

private:
    Ui::MainWindow *ui;
    QtDownload *dl; // Declare it here
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    dl(nullptr)
{
    ui->setupUi(this);

    //  QCoreApplication app(argc, argv);
    dl = new QtDownload();
    dl->setTarget("http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4");
    dl->download();

    // connect the signal `done()` to save the file or anything like that
    QObject::connect(dl, SIGNAL(done()), this, SLOT(downloadFinished()));

}

您应该将完成的信号连接到QMainWindow::close,为什么?当您的工作完成时,窗口将关闭,QApplication也将关闭,因为没有其他窗口保持可见。这需要问题的哪一部分?好的,谢谢您的帮助。另一个问题是我无法访问GUI中的progressBar void QtDownload::downloadProgressqint64 Received,qint64 total{//qDebug setMaximumtotal;//不工作MainWindow::ui->progressBar->SetValueReceived;////不工作}如何在QtDownload类中访问progressBarUi_MainWindow类?@如何完成代码: