2017-01-12 14 views
0

を呼び出すことはできません。まず、私の悪い英語を謝りたい。ここに私の個人的なプロジェクトのコードがあり、私は助けが必要です。実行時の現在のコードはこのビデオ(http://media09.vbox7.com/s/21/21bbc2dca3r3634e3389.mp4)をダウンロードする必要がありますが、動作しません。 // mainwindow.cppC++ - QTフレームワーク/メソッド

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())); 
........ 
} 
:例 - ビデオは、次のコードは

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

と私は方法のメインウィンドウで実行するに配置された場合にのみダウンロードされます

ここに、プログラムの現在のコードがあります。

// 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のprogressBarにアクセスできないということです。void QtDownload :: downloadProgress(qint64、qint64 total){ // qDebug()<< recieved << total; MainWindow :: ui-> progressBar-> setMaximum(total); //動作しません MainWindow :: ui-> progressBar-> setValue(recieved); ////は動作しません } QtDownloadクラスのprogressBar(Ui_MainWindowクラス)へのアクセス方法を教えてください。 –

+0

@Howto 私はあなたがしたいことに取り組んでいます。 – eyllanesc

+0

@Howto complete code:https://github.com/eyllanesc/stackoverflow/tree/master/downloader – eyllanesc

-1

ですから、QMainWindowでダウンロードを実行したい場合は...オブジェクトQtDownload dlMainWindowのポインタ財産であるべきか、それがQObject, hasとして、dlない限り、(破壊されることはありませんMainWindow`を親として)。

exec()が呼び出されたときにアプリケーションが実行されるのでmain()機能に遭遇し、それがこのケースでは動作しませんので、ダウンロード

だから、このようなものになります。あなたのために[OK]を感謝

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