View Full Version : آموزش: ارسال اطلاعات به اینترنت
AliRezaBeytari
پنج شنبه 13 شهریور 1393, 08:53 صبح
سلام دوستان.
خیلی مزاحم میشم !!! :لبخند: ببخشید !!! اگر میشه به این سوالم هم جواب بدید. خیلی ممنونم.
مثلا ما یه صفحه PHP با آدرس زیر داریم :
http://site.com/index.php
حالا من میخوام بدونم چطور میتونم با استفاده از Qt مقادیری رو با متود Post به این صفحه ارسال کنم ؟؟!!!
ممنونم میشم اگر راهنمایی کنید. :قلب:
omid_kma
پنج شنبه 13 شهریور 1393, 17:40 عصر
کلاس QNetworkAccessManager تابع post
http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html#post
AliRezaBeytari
پنج شنبه 13 شهریور 1393, 19:25 عصر
کلاس QNetworkAccessManager تابع post
http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html#post
من چیزی متوجه نشدم.
میشه یه نمونه ساده قرار بدید !
خیلی ممنونم.
omid_kma
پنج شنبه 13 شهریور 1393, 23:34 عصر
این مثال ساده (به فایل .pro مثل سوال قبلی QT += network هم اضافه کن ) (data اون اطلاعاتی هست که می خواهی post کنی )
#include <QApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QNetworkAccessManager manager;
QByteArray data;
data.push_back("data=text");
QNetworkRequest request(QUrl("http://www.test.com/"));
request.setHeader(QNetworkRequest::ContentTypeHead er,
"application/x-www-form-urlencoded");
manager.post(request,data);
QObject::connect(&manager, &QNetworkAccessManager::finished,[](QNetworkReply* reply){
qDebug() << reply->readAll();
});
return a.exec();
}
omid_kma
پنج شنبه 13 شهریور 1393, 23:38 عصر
عجب !! داخل اون کد بالا جلوی QUrl این هست : http://www.test.com (http://www.test.com/) نمی دونم چرا خودکار با <a href="http://www.test.com/" target="_blank">http://www.test.com/ (http://www.test.com/)</a>")); جایگزین میشه هرچی هم بین خطوط فاصله گذاشتم حذف شده !!!! indenet کد هم ریخته به هم !! من که هرکار کردم درست نشد !!
سایت برنامه نویسی ادیتورش در حد این سایتای دانلود فیلم و سریال هم نیست اعصاب نمیزاره به خدا آدم 2 خط تو این سایت مینویسه اندازه نوشتن 1 فصل یک کتاب وقت باید بزاره
AliRezaBeytari
جمعه 14 شهریور 1393, 12:14 عصر
متاسفانه کار نکرد ! :ناراحت:
omid_kma
جمعه 14 شهریور 1393, 12:45 عصر
من نمی دونم دقیقا با چه سایتی تست کردید
من اینو تست کردم درست بود :(محتویات فایل test.html که در محل پروژه ساخته میشه رو ببینید )
http://paste.ofcode.org/U6qjs7MVMTynKc3956V3fU
AliRezaBeytari
جمعه 14 شهریور 1393, 12:55 عصر
من نمی دونم دقیقا با چه سایتی تست کردید
من اینو تست کردم درست بود :(محتویات فایل test.html که در محل پروژه ساخته میشه رو ببینید )
http://paste.ofcode.org/U6qjs7MVMTynKc3956V3fU
این پروژه ای هست که من نوشتم :
http://0up.ir/up8/guest/9-Qt-Send-Data-To-Web-Page.rar
محتویات فایل qt-server.php هم اینه :
<?php
if(isset($_POST['id']) && !empty($_POST['id'])) {
$id = 'Your ID Is : ' . $_POST['id'];
file_put_contents("qt-data.txt", $id);
}
اما فایلی با نام qt-data.txt ساخته نمیشه !!
میشه راهنمایی کنید.
omid_kma
جمعه 14 شهریور 1393, 13:17 عصر
بخاطر این هست که وقتی اطلاعات رو میفرستید به سرور نباید شی کلاس accessManager پاک بشه . شی رو بصورت فیلد private کلاس بزارید . (یا از new استفاده کنید )
این فایل .cpp که من الان تست کردم : (قبل از تست کردن url ای که من دادم رو عوض کنید )
http://paste.ofcode.org/s87GTC8z5LhGaVWKwF8ZbB
اینم .h :
http://paste.ofcode.org/38wcLUqJChJxczmGQUNMpxs
AliRezaBeytari
جمعه 14 شهریور 1393, 13:45 عصر
بخاطر این هست که وقتی اطلاعات رو میفرستید به سرور نباید شی کلاس accessManager پاک بشه . شی رو بصورت فیلد private کلاس بزارید . (یا از new استفاده کنید )
این فایل .cpp که من الان تست کردم : (قبل از تست کردن url ای که من دادم رو عوض کنید )
http://paste.ofcode.org/s87GTC8z5LhGaVWKwF8ZbB
اینم .h :
http://paste.ofcode.org/38wcLUqJChJxczmGQUNMpxs
خیلی ممنونم. کار کرد !! :قلب:
فقط یه سوال دیگه !! :لبخند:
این کد رو ببینید :
QObject::connect(&manager, &QNetworkAccessManager::finished,[](QNetworkReply* reply){
QString result_q = reply->readAll();
});
this->ui->textEdit->setText(result_q);
چرا از این کد خطا میگیره ؟؟!!!
http://8pic.ir/images/gvz9unh954ca24shzpju.png
omid_kma
جمعه 14 شهریور 1393, 13:50 عصر
چون [] یک لامبدا میسازه لامبدا هم مثل توابع متغیر هایی که داخلشون تعریف میشه خارج از lambda قابل استفاده نیستن این طوری بنویس :
QObject::connect(&manager, &QNetworkAccessManager::finished,[this](QNetworkReply* reply){
this->ui->textEdit->setText(reply->readAll());
});
ضمنا داخل [] نوشتیم this یعنی این که از this بشه داخل بدنه lambda استفاده کرد حالت عادی نمیشه .
در مورد lambda ها داخل این لینک توضیحات کاملی هست http://www.7khatcode.com/3180/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-c-11
AliRezaBeytari
جمعه 14 شهریور 1393, 13:54 عصر
چون [] یک لامبدا میسازه لامبدا هم مثل توابع متغیر هایی که داخلشون تعریف میشه خارج از lambda قابل استفاده نیستن این طوری بنویس :
QObject::connect(&manager, &QNetworkAccessManager::finished,[this](QNetworkReply* reply){
this->ui->textEdit.setText(reply->readAll());
});
ضمنا داخل [] نوشتیم this یعنی این که از this بشه داخل بدنه lambda استفاده کرد حالت عادی نمیشه .
در مورد lambda ها این لینک رو بخونید http://www.7khatcode.com/3180/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-c-11?show=3180#q3180
این ارور رو میده :
123106
حالا اگر بخوام result رو درون یه متغییر QString بریزم باید چیکار کنم ؟؟!!
omid_kma
جمعه 14 شهریور 1393, 13:57 عصر
ویرایش کردم پست قبلی رو . (بجای . باید -> میزاشتم )
اگر بخوای داخل String بریزی یک متغیر private داخل کلاس تعریف کن بعد داخل lambda بهش مقدار بده .
AliRezaBeytari
جمعه 14 شهریور 1393, 14:03 عصر
ویرایش کردم پست قبلی رو . (بجای . باید -> میزاشتم )
اگر بخوای داخل String بریزی یک متغیر private داخل کلاس تعریف کن بعد داخل lambda بهش مقدار بده .
کار میکنه ، اما نمیدونم چرا باید دو بار بر روی دکمه کلیک کنم تا متن درون textEdit قرار بگیره :
http://0up.ir/up8/guest/5-Qt-Send-Data-To-Web-Page.rar
omid_kma
جمعه 14 شهریور 1393, 14:12 عصر
به این شکلی که نوشتید اشتباه هست
این خط :
this->ui->textEdit->setText(result);
داخل بدنه تابع هست نه lambda و قبل از این که نتیجه از سرور برگرده اجرا میشه (این جا لامبدا زمانی اجرا میشه که reply از سرور برگرده )
دفعه اول چون result خالی هست چیزی نوشته نمیشه ولی دفعات بعدی چون احتمالا جواب از سرور برگشته نتیجه داخلش ذخیره شده .
انتقالش بدین به داخل لامبدا درست میشه .
AliRezaBeytari
جمعه 14 شهریور 1393, 14:15 عصر
به این شکلی که نوشتید اشتباه هست
این خط :
this->ui->textEdit->setText(result);
داخل بدنه تابع هست نه lambda و قبل از این که نتیجه از سرور برگرده اجرا میشه (این جا لامبدا زمانی اجرا میشه که reply از سرور برگرده )
دفعه اول چون result خالی هست چیزی نوشته نمیشه ولی دفعات بعدی چون احتمالا جواب از سرور برگشته نتیجه داخلش ذخیره شده .
انتقالش بدین به داخل لامبدا درست میشه .
خیلی ممنونم. درست شد.
فقط یه مشکلی هست. اگر من دوباره بر روی دکمه کلیک کنم ، متن داخل textEdit خالی میمونه !!!
چکار کنم که هر دفعه که کلیک میشه این مشکل به وجود نیاد !!!
omid_kma
جمعه 14 شهریور 1393, 14:20 عصر
اول تابع( و خارج از لامبدا) اینو بنویسید :
ui->textEdit->clear();
تا محتوای textEdit پاک بشه (البته اگر منظورتون رو درست متوحه شده باشم ؟! )
motherboard
جمعه 14 شهریور 1393, 14:37 عصر
منظورت از لامبدا چی هست؟
omid_kma
جمعه 14 شهریور 1393, 16:35 عصر
منظورت از لامبدا چی هست؟
این جا قبلا توضیح داده شده (قسمت lambda functions/expressions
http://www.7khatcode.com/3180/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-c-11
AliRezaBeytari
جمعه 14 شهریور 1393, 16:56 عصر
اول تابع( و خارج از لامبدا) اینو بنویسید :
ui->textEdit->clear();
تا محتوای textEdit پاک بشه (البته اگر منظورتون رو درست متوحه شده باشم ؟! )
نه کار نکرد.
مثلا وقتی که برای اول روی دکمه کلیک میکنی اطلاعات رو نشون میده. اما اگر دوباره بعدش یه بار دیگه روی دکمه کلیک کنی متن داخل editText خالی میشه و هیچی توش نمایش داده نمیشه !!!
omid_kma
جمعه 14 شهریور 1393, 17:07 عصر
اینو امتحان کن ببین درسته :http://paste.ofcode.org/h7YmR47H25SVAYnWgMHyAK
اگر نبود کدت رو بزار
ehsan_faal
جمعه 14 شهریور 1393, 19:09 عصر
سلام دوستان.
خیلی مزاحم میشم !!! :لبخند: ببخشید !!! اگر میشه به این سوالم هم جواب بدید. خیلی ممنونم.
مثلا ما یه صفحه PHP با آدرس زیر داریم :
http://site.com/index.php
حالا من میخوام بدونم چطور میتونم با استفاده از Qt مقادیری رو با متود Post به این صفحه ارسال کنم ؟؟!!!
ممنونم میشم اگر راهنمایی کنید. :قلب:
خیلی جالبه که عنوان این تاپیک رو گذاشتی آموزش.:متعجب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.