POJ代码提交器 QNetworkAccessManager post get
这两天闲着蛋疼,写了个代码POJ代码提交器,如图

代码记录下来吧,重在QNETWORKACCESSMANAGER的使用:
#ifndef MYCODE_H
#define MYCODE_H
#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include<QNetworkRequest>
#include<QUrl>
#include<string>
using std::string;
namespace Ui {
class MyCode;
}
class MyCode : public QWidget
{
Q_OBJECT
public:
explicit MyCode(QWidget *parent = 0);
~MyCode();
private:
QNetworkAccessManager *manager;
QNetworkReply *rep;
Ui::MyCode *ui;
char cur_lang();
void init_set();
public slots:
void login();
void post();
void after_post(QNetworkReply*);
void updateProgress(qint64,qint64);
void deal_poj(QNetworkReply*);
void deal_hdoj(QNetworkReply*);
void deal_result(QNetworkReply*);
void get_result();
};
#endif // MYCODE_H
#include "mycode.h"
#include "ui_mycode.h"
#include<QFile>
#include<QTextStream>
#include<string>
#include<QIcon>
MyCode::MyCode(QWidget *parent) :
QWidget(parent),manager(new QNetworkAccessManager(this)),
ui(new Ui::MyCode)
{
ui->setupUi(this);
init_set();
connect(ui->loginPushButton,SIGNAL(clicked()),this,SLOT(login()));
connect(ui->postButton,SIGNAL(clicked()),this,SLOT(post()));
connect(ui->refreshButton,SIGNAL(clicked()),this,SLOT(get_result()));
}
MyCode::~MyCode()
{
delete ui;
}
void MyCode::login()
{
if(ui->judgeBox->currentText()==tr("POJ"))
{
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(deal_poj(QNetworkReply*)));
QString append=("user_id1="+ui->userEdit->text()+"&password1="+ui->passEdit->text()+"&B1=login&url=%2F");
rep=manager->post(QNetworkRequest(QUrl("http://poj.org/login")),append.toAscii());
connect(rep,SIGNAL(uploadProgress(qint64,qint64)),SLOT(updateProgress(qint64,qint64)));
}
else
{
}
}
void MyCode::init_set()
{
this->setFixedSize(this->width(),this->height());
ui->userEdit->setFocus();
ui->userEdit->setMaxLength(16);
ui->probEdit->setText("2013");
ui->passEdit->setEchoMode(QLineEdit::Password);
ui->userEdit->setMaxLength(16);
ui->progressBar->setFixedSize(this->width(),10);
ui->progressBar->setValue(0);
ui->userEdit->setText("627377770");
ui->passEdit->setText("aaabbbccc");
QIcon icon(":ioc.jpg");
this->setWindowIcon(icon);
//ui->progressBar->hide();
}
void MyCode::post()
{
if(ui->judgeBox->currentText()==tr("POJ"))
{
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(after_post(QNetworkReply*)));
QString append=("problem_id="+ui->probEdit->text()+"&language="+cur_lang()+"&source="+ui->codeEdit->toPlainText()+"&submit=Submit");
rep=manager->post(QNetworkRequest(QUrl("http://poj.org/submit")),append.toAscii());
connect(rep,SIGNAL(uploadProgress(qint64,qint64)),SLOT(updateProgress(qint64,qint64)));
}
}
void MyCode::updateProgress(qint64 cur, qint64 total)
{
if(total!=0)
ui->progressBar->setValue(cur/total*100);
}
void MyCode::deal_poj(QNetworkReply *reply)
{
updateProgress(0,100);
if(reply->error()==QNetworkReply::NoError)
{
if(reply->error()==QNetworkReply::NoError)
{
ui->loginPushButton->setEnabled(false);
ui->userEdit->setEnabled(false);
ui->passEdit->setEnabled(false);
}
reply->deleteLater();
disconnect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(deal_poj(QNetworkReply*)));
}
else return;
}
//G++ GCC JAVA PASCAL C++ C FORTRAN
void MyCode::deal_hdoj(QNetworkReply *reply)
{
reply->deleteLater();
}
char MyCode::cur_lang()
{
if(ui->judgeBox->currentText()=="POJ")
{
if(ui->langBox->currentText()=="G++")
return '0';
else if(ui->langBox->currentText()=="GCC")
return '1';
else if(ui->langBox->currentText()=="Java")
return '2';
else if(ui->langBox->currentText()=="Pascal")
return '3';
else if(ui->langBox->currentText()=="C++")
return '4';
else if(ui->langBox->currentText()=="C")
return '5';
else if(ui->langBox->currentText()=="Fortran")
return '6';
}
else if(ui->judgeBox->currentText()=="HDOJ")
{
}
}
void MyCode::after_post(QNetworkReply *reply)
{
updateProgress(0,100);
if(reply->error()==QNetworkReply::NoError)
{
disconnect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(after_post(QNetworkReply*)));
get_result();
}
}
void MyCode::get_result()
{
if(ui->judgeBox->currentText()=="POJ")
{
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(deal_result(QNetworkReply*)));
rep=manager->get(QNetworkRequest(QUrl("http://poj.org/status")));
connect(rep,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateProgress(qint64,qint64)));
}
else
{
}
}
void MyCode::deal_result(QNetworkReply *reply)
{
// QByteArray arr=reply->readAll();
// QString string=QString::fromUtf8(arr);
// ui->codeEdit->setText(arr);
updateProgress(0,100);
if(reply->error()==QNetworkReply::NoError)
{
if(ui->judgeBox->currentText()=="POJ")
{
QByteArray arr=reply->readAll();
QString data=QString::fromUtf8(arr);
data.replace(' ','.');
data.replace('\n','.');
QFile file("/home/Focuson/Desktop/temp.txt");
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out<<data;
file.close();
int index=data.toStdString().find(ui->userEdit->text().toStdString());
index=data.toStdString().find(ui->userEdit->text().toStdString(),index+1);
index=data.toStdString().find(ui->userEdit->text().toStdString(),index+1);
index=data.toStdString().find(ui->userEdit->text().toStdString(),index+1);
char result[9][30]={"Accepted",
"Presentation.Error",
"Time.Limit.Exceeded",
"Memory.Limit.Exceeded",
"Wrong.Answer",
"Runtime.Error",
"Output.Limit.Exceeded",
"Compile.Error",
"Compiling"};
int t[9]={INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX};
for(int i=0;i<9;i++)
{
int a=data.toStdString().find(result[i],index);
if((size_t)a!=std::string::npos)
{
t[i]=a;
}
}
int res=0,min=t[0];
for(int i=0;i<9;i++)
{
if(min>t[i])min=t[i],res=i;
}
//QString(result[res]).replace('.',' ').toStdString().c_str();
ui->statuLabel->setText(QString(result[res]).replace('.',' ').toStdString().c_str());
disconnect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(deal_result(QNetworkReply*)));
}
}
reply->deleteLater();
}

浙公网安备 33010602011771号