PDA

View Full Version : سوال: گرفتن سورس سایت در Qt



AliRezaBeytari
سه شنبه 18 شهریور 1393, 14:27 عصر
سلام دوستان.
من چطور میتونم سورس یه صفحه اینترنتی رو درون یه QString ذخیره کنم ؟؟!!!

ciph3r
سه شنبه 18 شهریور 1393, 15:26 عصر
شما میتونید از QNetworkaccessmanager ده کنید
با QNetworkrequest و Reply می تونید بر اعمال درخواست دست ببرید و در نهایت با تابع


void
finished (http://barnamenevis.org/qnetworkaccessmanager.html#finished) ( QNetworkReply * reply )



و کانکت شدن سیگنال اسلات کردن به آن تابع سورس سایت هدف رو بگیرید با reply.readAll
فقط این نکته رو بدون که اول مقدار رو بریز تو یه QBytearray و سپس بریز تو QString

AliRezaBeytari
سه شنبه 18 شهریور 1393, 15:52 عصر
شما میتونید از QNetworkaccessmanager ده کنید
با QNetworkrequest و Reply می تونید بر اعمال درخواست دست ببرید و در نهایت با تابع


void
finished (http://barnamenevis.org/qnetworkaccessmanager.html#finished) ( QNetworkReply * reply )


و کانکت شدن سیگنال اسلات کردن به آن تابع سورس سایت هدف رو بگیرید با reply.readAll
فقط این نکته رو بدون که اول مقدار رو بریز تو یه QBytearray و سپس بریز تو QString




از پاسختون ممنونم. اما چون من خیلی مبتدی هستم ، تقریبا هیچی نفهمیدم !!! :لبخند:
اگر میشه یه سورسی چیزی بدید !
خیلی ممنونم ! :قلب:

returnx
چهارشنبه 19 شهریور 1393, 09:01 صبح
میتونید به این شکل عمل کنید :
#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <string>
#include <conio.h>

using namespace std;

void request_responsed(QNetworkReply *reply);

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<<"Please Insert URL[with protocol]: ";
string temp;
cin>>temp;
QString string_url=QString(temp.c_str()); //Convert std String to QString
QNetworkAccessManager *i_network_manager =new QNetworkAccessManager();
QObject::connect(i_network_manager,&QNetworkAccessManager::finished,request_responsed) ; //Connect Signal To Slot
i_network_manager->get(QNetworkRequest(QUrl(string_url))); //Send HTTP Get Request To Server

return a.exec();
}

void request_responsed(QNetworkReply *reply)
{
//Print Server Data:
cout <<"Header Information :"<<"\n";
cout<<"Header Length: " <<reply->header(QNetworkRequest::ContentLengthHeader).toInt ()<<"\n";
cout<<"Header Type: "<<reply->header(QNetworkRequest::ContentTypeHeader).toStrin g().toStdString()<<"\n";
cout<<"Web Server: "<<reply->header(QNetworkRequest::ServerHeader).toString().t oStdString()<<"\n";
cout<<"Lastmodified: "<<reply->header(QNetworkRequest::LastModifiedHeader).toStri ng().toStdString()<<"\n";
cout<<"WebPage Sourec:"<<"\n";
cout<<QString(reply->readAll()).toStdString();
getch();
qApp->exit(EXIT_SUCCESS);

}

omid_kma
چهارشنبه 19 شهریور 1393, 11:53 صبح
یا با استفاده از webkit و این سیگنال http://qt-project.org/doc/qt-5/qwebview.html#loadFinished

#include <QApplication>
#include <QWebElement>
#include <QWebFrame>
#include <QWebPage>
#include <QWebView>
#include <QDebug>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QWebView *view = new QWebView;
view->load(QUrl("http://www.w3schools.com/html/"));
QObject::connect(view, &QWebView::loadFinished, [view](bool state){
if (state){
QWebElement document=view->page()->currentFrame()->documentElement();
auto body=document.findFirst("body");
qDebug()<<body.toPlainText();
}
});
view->show();
return a.exec();
}

AliRezaBeytari
جمعه 25 مهر 1393, 11:27 صبح
دوستان ، من اینطوری سورس سایت رو دریافت کردم:


void MainWindow::SendRequest()
{
// create custom temporary event loop on stack
QEventLoop eventLoop;

// "quit()" the event-loop, when the network request "finished()"
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

// the HTTP request
QNetworkRequest req( QUrl( QString(ui->txtUrl->text()) ) );
QNetworkReply *reply = mgr.get(req);
eventLoop.exec(); // blocks stack until "finished()" has been called

if (reply->error() == QNetworkReply::NoError) {
//success
QString finalText = reply->readAll().replace("<", "&lt;").replace(">", "&gt;");
ui->textEdit->setText(finalText);
delete reply;
}
else {
//failure
ui->textEdit->setText("Failure" + reply->errorString());
delete reply;
}
}

void MainWindow::on_btnGetSiteSource_clicked()
{
SendRequest();
}


حالا میخوام از یه progress bar استفاده کنم.
یعنی وقتی که کاربر بر روی دکمه "دریافت سورس" کلیک کرد ، اون مدت زمانی که طول میکشه سورس سایت دریافت بشه ، به صورت یه progress bar نمایش بدم.
لطفا راهنمایی کنید.

خیلی ممنونم.