PDA

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 به این صفحه ارسال کنم ؟؟!!!
ممنونم میشم اگر راهنمایی کنید. :قلب:
خیلی جالبه که عنوان این تاپیک رو گذاشتی آموزش.:متعجب: