这两天闲着蛋疼,写了个代码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(); }