2017-01-12 12 views
0

。首先,我想爲我的糟糕英語道歉。這是我的個人項目之一的代碼,我需要幫助。執行中的當前代碼應下載此視頻 - http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4,但不起作用。視頻僅下載時,下面的代碼放在C++ - QT框架/無法喚起每個人的方法

// 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())); 
........ 
} 

這是程序的當前代碼。

// downloader.pro

#------------------------------------------------- 
# 
# 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 

// mainwindow.h

#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

#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; 
} 

回答

0

我已經試過你的代碼,我遇到了同樣的問題,你報告,只改變對象的創建到一個指針和神奇的安排,我仍然不明白錯誤的原因,我會繼續尋找理由。

你必須是:

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

好,謝謝您幫幫我。另一個問題是我沒有訪問進度條在GUI無效QtDownload :: downloadProgress(qint64收到,總共qint64){qrbug()<< recieved << total;主窗口:: UI-> progressBar-> setMaximum(總); //不起作用 MainWindow :: ui-> progressBar-> setValue(recieved); ////不起作用 }我如何訪問QtDownload類中的progressBar(Ui_MainWindow類)? –

+0

@Howto 我正在處理你想要的東西。 – eyllanesc

+0

@Howto完整代碼:https://github.com/eyllanesc/stackoverflow/tree/master/downloader – eyllanesc

-1

所以..如果你想在QMainWindow運行下載的對象QtDownload dl應該是MainWindow指針財產,否則將不被破壞(除非dl,作爲QObject, has MainWindow`作爲父項)。

潤成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())); 

} 
+0

**您應該將信號done()連接到QMainWindow :: close()**,爲什麼? – eyllanesc

+0

當您的工作完成後,窗口將關閉並且QApplication也會因爲沒有其他窗口保持可見狀態而關閉。 –

+0

問題的哪一部分需要? – eyllanesc