Qt QJsonModel在网络请求结束时没有工作

时间:2016-03-06 04:10:01

标签: c++ json qt treeview

因此,在我创建QJsonModel,加载数据并设置treeView模型之后,它会将数据正常加载到treeView中。虽然,当我在完成网络请求(subprocess.check_process(cmd, shell=True, stdout=False) )后执行此操作时,它并不是真的。我可以qDebug传递的Json数据,但是当它归结为Json加载和模型设置时。它没能完成。此外,由于某种原因,它不会从网络请求中设置Json,但如果我只是将其设置为从单独的按钮设置json,则json会成功添加。这意味着Json格式正确。 QJsonModel& QJsonItem是未提供Qt的外部类,位于here。 这是我的代码:

Mainwindow.h:

serviceRequestFinished(QNetworkReply* reply)

Mainwindow.cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QModelIndex>
#include <QItemSelection>
#include <QFile>
#include <QFileInfo>
#include <QList>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QStringList>
#include <QTimer>
#include <QUrl>
#include <QTreeWidgetItem>
#include <QJsonDocument>
#include <QJsonObject>
#include "qjsonmodel.h"
#include <QClipboard>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    void setJson(QString json);
    void getPlaylistList(QString accessToken);
    QString disableStreams();
    void appendEditValues(int currentRow);
    void addVectorItems();
    void streamCheck();

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

private slots:
    void on_radioButtonNoStream_clicked()
    {
        streamCheck();
    }

    void on_radioButtonTwitchStream_clicked()
    {
        streamCheck();
    }

    void on_radioButtonYTStream_clicked()
    {
        streamCheck();
    }

    void on_pushButtonAddVid_clicked();

    void on_pushButtonApplyAddVid_clicked();

    void on_pushButtonDeleteSelection_clicked();

    void on_pushButtonApplyAll_clicked();

public slots:
    void serviceRequestFinished(QNetworkReply* reply);

    void connectAPI(QString code);

signals:
    void authenticate(QString accessCode);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Main.cpp的:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "authdialog.h"
#include <qDebug>
#include <QVector>
#include <QMessageBox>
#include <QStandardItemModel>
#include <QFile>
#include <QUrlQuery>

int val = 0;
int selected;

QVector<QString> vidTitles;
QVector<QString> vidUrls;
QVector<int> vidNumber;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    streamCheck();
    ui->groupBoxEditVideo->setEnabled(false);
    connect(this, SIGNAL(authenticate(QString)), SLOT(connectAPI(QString)));
}

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

void MainWindow::streamCheck()
{
    if (ui->radioButtonNoStream->isChecked())
    {
        ui->groupBoxStreamSetup->setEnabled(false);
        ui->groupBoxStreamSetup->setTitle("No Stream Selected!");
    }
    else if (ui->radioButtonTwitchStream->isChecked())
    {
        ui->groupBoxStreamSetup->setEnabled(true);
        ui->groupBoxStreamSetup->setTitle("Twitch Setup");
    }
    else if (ui->radioButtonYTStream->isChecked())
    {
        ui->groupBoxStreamSetup->setEnabled(true);
        ui->groupBoxStreamSetup->setTitle("YouTube Stream Setup");
    }
}

void MainWindow::on_pushButtonAddVid_clicked()
{
    AuthDialog *auth = new AuthDialog(this);
    auth->setModal(true);
    auth->exec();
    delete auth;
}

void MainWindow::setJson(QString json)
{
    qDebug() << json;
    QJsonModel * model = new QJsonModel;
    model->loadJson(json.toUtf8());
    ui->treeView->setModel(model);
    delete model;
}

void MainWindow::getPlaylistList(QString accessToken)
{
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    //
    QNetworkRequest request(QUrl("https://www.googleapis.com/youtube/v3/search?part=snippet&forMine=true&order=viewCount&type=video&access_token=" + accessToken));
    networkManager->get(request);
}

QString MainWindow::disableStreams()
{
    QString line = "";
    QString test = "";
    QFile file;
    file.setFileName("C:/WampStack/apache2/htdocs/index.html");
    file.open(QIODevice::ReadWrite);
    QTextStream in(&file);

    while(!in.atEnd())
    {
        line += in.readAll();
    }
    if (line.contains("<!--t-->") && !line.contains("<!--y-->"))
    {
        //Twitch Stream is on, must turn it off
        test = line.replace("<!--t-->", "<!--t");
        test = test.replace("><!--tt-->", ">tt-->");
        return test;
    }
    else if (line.contains("<!--y-->") && !line.contains("<!--t-->"))
    {
        //YouTube Stream is on, must turn it off
        test = line.replace("<!--y-->", "<!--y");
        test = test.replace("><!--yy-->", ">yy-->");
        return test;
    }
    else if (line.contains("<!--y-->") && line.contains("<!--t-->"))
    {
        test = line.replace("<!--y-->", "<!--y");
        test = test.replace("><!--yy-->", ">yy-->");
        test = test.replace("<!--t-->", "<!--t");
        test = test.replace("><!--tt-->", ">tt-->");
        return test;
    }
    else
    {
        return line;
    }
    file.close();
    return line;
}

void MainWindow::connectAPI(QString code)
{
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    QUrlQuery postData;
    postData.addQueryItem("code", code);
    postData.addQueryItem("client_id", "CLIENT-ID");
    postData.addQueryItem("client_secret", "CLIENT-SECRET");
    postData.addQueryItem("redirect_uri", "REDIRECT-URI");
    postData.addQueryItem("grant_type", "authorization_code");
    QNetworkRequest request(QUrl("https://accounts.google.com/o/oauth2/token"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
}

void MainWindow::appendEditValues(int currentRow)
{

}

void MainWindow::addVectorItems()
{

}

void MainWindow::on_pushButtonApplyAddVid_clicked()
{

}

void MainWindow::on_pushButtonDeleteSelection_clicked()
{
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, "Are you sure?", "Do you want to permanently delete this entry?", QMessageBox::Yes|QMessageBox::No);
    if (reply == QMessageBox::Yes)
    {



    }
    addVectorItems();
}

void MainWindow::on_pushButtonApplyAll_clicked()
{
    QString line = disableStreams();
    QFile::remove("C:/WampStack/apache2/htdocs/index.html");
    QFile file;
    file.setFileName("C:/WampStack/apache2/htdocs/index.html");
    file.open(QIODevice::ReadWrite);
    //Start code for streaming
    if (ui->radioButtonTwitchStream->isChecked() && line.contains("<!--t") && line.contains(">tt-->") && !line.contains("<!--t-->") && !line.contains("<!--tt-->"))
    {
        QString test = line.replace("<!--t", "<!--t-->");
        test = line.replace(">tt-->", "><!--tt-->");
        QTextStream stream( &file );
        stream << test;
    }
    else if (ui->radioButtonYTStream->isChecked() && line.contains("<!--y") && line.contains(">yy-->") && !line.contains("<!--y-->") && !line.contains("<!--yy-->"))
    {
        QString test = line.replace("<!--y", "<!--y-->");
        test = test.replace(">yy-->", "><!--yy-->");
        QTextStream stream( &file );
        stream << test;
    }
    else if (ui->radioButtonNoStream->isChecked())
    {
        QTextStream stream(&file);
        stream << line;
    }
    //End code for streaming
    file.close();
}

void MainWindow::serviceRequestFinished(QNetworkReply* reply)
{
    QByteArray json = reply->readAll();
    QString output = QString::fromUtf8(json);
    QJsonDocument settdoc = QJsonDocument::fromJson(output.toUtf8());
    QJsonObject sett2 = settdoc.object();
    if (val == 0)
    {

        val++;
        getPlaylistList(sett2.value(QString("access_token")).toString());
    }
    else if (val == 1)
    {
        setJson(output.toUtf8());
    }

}

1 个答案:

答案 0 :(得分:0)

QJsonModel仅在JSON的根元素是对象时才有效(请参阅contracts)。我想你的JSON的根是一个数组。