This forum has been archived. All content is frozen. Please use KDE Discuss instead.

نوشتن برنامه های qt

Tags: None
(comma "," separated)
User avatar
pesarkhobeee
Posts
22
Karma
0

اموزش Qt قسمت ششم

Mon Aug 31, 2009 5:51 am
خوب بلاخره به قسمت پایانی اشنایی با کیوت رسیدیم!
در این قسمت از این سری اموزش ها ما برنامه ای رو که در پنج قسمت قبل درست کردیم رو تکمیل میکنیم و کاری میکنیم تا وقتی کاربر روی دکمه برناممون کلیک کرد متن برچسبمون عوض شه و با پایان این قسمت ما در مجموع این شش قسمت با کلیت یک برنامه ساده کیوت اشنا شدیم .
و از این به بعد نمونه های اموزشی کیوت رو خیلی راحتتر میفهمیم و اگه کمی پایه باشید! میتونید با کمی تلاش برنامه های ساده ای بنویسید.
خوب یکی از ویژگی هایی که  کیوت رو نسبت به بقیه متفاوت کرده راهکار اون برای تعامل با رخدادهایی که در برنامه رخ میده!
در کیوت مکانیزمی تعبیه شده به اسم Signal & Slot که فلسفه این مکانیزم اینطوری که در برنامه ما که طبیعتا رویدادگراست وقتی که برای یک کنترل یا همون Widget یه شرایط خاص مثلا کلیک شدن پیش میاد اون کنترل از خودش یک نشونه مخصوص این رخداد رو ازاد میکنه که اصطلاحا Signal نامیده میشه ! خوب ما اگه بخواهیم برای این حالت از کنترلمون کدهایی رو بنویسیم باید این کدها رو در یک متد از کلاسمون قرار بدیم که اصطلاحا بهش Slot میگن و تنها چیزی که میمونه اینه که برنامه چطوری باید تشخیص بده وقتی در یک کنترل خاص رویداد خاصی رخ داد اون رو به کدوم Slot ارجا بده که کیوت این کار رو توسط تابع connect اجام میده!
شاید نتونسته باشم مطلبو خوب برسونم اما وقتی مثالو ببینید حتما متوجه میشید!
خوب اول از همه میریم سراغ فایل سرایندمون که همه چیز کلاسمون در اون تعریف میشه:
hello.h
به این فایل دو خط زیرو اضافه میکنیم:
Code: Select all

private slots:
void showHello();


خوب همون طور که میبینید در کیوت نسبط به سی پلاس پلاس معمولی چیزهایی اضافه داریم که در اینجا public slots و private slots هست !
کاملا واضحه که داریم اول مشخص میکنیم که اسلات مورد نظرمون public یا private  و بعد اونو تعریف اولیه میکنیم.

و اما در جایی که میخواهیم از مکانیزم سیگنال اسلات و یه سری چیز دیگه استفاده کنیم باید یه کد خاص رو به اون کلاس که فکر کنم شبیه یه ماکرو باشه رو اضافه کنیم!
پس کد Q_OBJECT رو به تعریف کلاسمون به این صورت اضافه میکنیم:
Code: Select all

class hello : public QWidget
{
Q_OBJECT



خوب حالا که تعریف اولیه کردیم میریم سراغ فایل اصلی کلاسمون یعنی hello.cpp :
یک تابع جدید به کلاسمون اضافه میکنیم که همون اسلات ماست:

Code: Select all
void hello::showHello()
{
   QString str = QString::fromUtf8("افتتاح سایت زنجان لاگ مبارک باد<br> www.zanjanlug.org");
   label->setText(str);
}


خوب در اینجا ما متغیری به نام str از نوع Qstring ساختیم  و گفتیم تحت یونیکد utf8 باشه تا با فارسی مشکل نداشته باشیم و سپس متن برچسبمون رو این متغیر قرار دادیم.

تنها کاری که میمونه اینه که توسط تابع connect مبدا و مقصد و نوع سیگنال رو مشخص کنیم پس در تابع hello کلاسمون این تکه کد رو اضافه میکنیم:

Code: Select all
connect(button, SIGNAL(clicked()),this,SLOT(showHello()));


خوب همون طور که میبینید مثل باقلوا داره منظور ما رو مشخص میکنه!!! در ارگومان اول این تابع کنترل مبدا ما مشخص میشه و در ارگومان دوم ما نوع سیگنال مورد نظر که در اینجا کلیک شدن هست مشخص میشه و در ارگومان سوم مقصد ما و در ارگومان چهارم ما نام اسلات ما مشخص میشه.

خوب اگر تغییراتو به درستی اعمال کنید و برنامه رو یک بار کامپایل و اجرا کنید و روی دکمه enter بزنید باید با صحنه زیر روبرو بشید:


Image


در اخر کدهایی که در مجموع این شش قسمت تکمیل شدن رو ضمینه میکنم و خیلی راحت میتونید با زدن دستور:
Code: Select all
./hello

این کدهارو اجرا کنید و برنامه رو ببینید .
http://pitm.net/Blog/wp-content/hello.tar.gz

به امید اینکه این سری از اموزش ها نظرتونو جلب کرده باشه امیدوارم به بزرگی خودتون خطاهای من رو در نوشتن تجربیات خودم در یادگیری این قالب قدرتمند برنامه نویسی ببخشید.
همینجا لازم میدونم باز از کسانی که در این مدت بنده رو راهنمایی کردن تشکر کنم از جمله جناب mtux و اقای اطهری امیدوارم همیشه موفق باشند.
امیدوارم منابع فارسی راجع به این موضوعات هر روز بیشتر از روزهای قبل بشه اگر از این نوشته های من بی سواد خوشتون اومد خواهش میکنم یه صلوات هدیه کنید برای ظهور اقا امام زمان.
علی یارتون

Last edited by pesarkhobeee on Mon Aug 31, 2009 5:59 am, edited 1 time in total.
User avatar
luis.mahdi
Posts
2
Karma
0
[quote=&quot;Yousha&quot;]
سلام دوستان

وقتی من دستور qmake رو می زنم میگه bash: qmake: command not found
فک کنم میگه نصب نیست و تو مخازن هم نبود
من OpenSUSE 11.1 استفاده می کنم
دوستان راهنمایی کنن ممنون میشم‌:)
[/quote]


سلام به همه من هم همین مشکل را دارم البته اولین راه حلم این بوده که به جای این توزیع از پارسیکس استفاده می کنم دیگه این مشکل پیش نمی یاد

اما جایی خوندم که اگه مسیر خودتون رو به root تغییر بدین دیگه ای مشکل به وجود نمی آد
User avatar
luis.mahdi
Posts
2
Karma
0
آقا من یه پیش نهاد خیلی سخت واسه آقا فرید دارم

چرا می خوایین این قسمت رو دیگه ادامه ندید؟

نکنه مثل فوتبالیستای با کلاس می خوای تو اوج کنار بری ؟


از این به بعد هم بیاین با هم مطالب جدیدمون رو اینجا بزاریم

تا دیگران هم استفاده کنند و مثل من شاید علاقه مند بشن و کم کم خودشون برن دنبال بقیه مسائل


منتظر نظرات اساتید هستم
User avatar
pesarkhobeee
Posts
22
Karma
0
سلام من کی گفتم دیگه ادامه نمیدم؟ گفتم قسمت اشنایی با کیوت تموم شد!
یعنی به صورت اولیه مثل هر زبان دیگه ای روند یک hello world  رو رفتیم و با اصول اولیه اشنا شدیم.
ایشالله اگه خدا بخواد و خودمم تنبلی نکنمو اساتیدم کمک کنند میخوام روند یادگیری خودمو در مورد کیوت مستند کنم تا نفرات بعد ، حداقل به زبان مادریشون یه چیزایی ببینن انشالله.
خیلی هم خوشحال میشم اگر کسان دیگه ای تجربیات و نکاتشونو و حتی شاید اموزش هاشونو اینجا بزارن تا همه استفاده کنیم ;)
علی یارتون
User avatar
pesarkhobeee
Posts
22
Karma
0
سلام
در qt Creator  من نتونستم در قسمت ویژگی ها خصیصه ایو پیدا کنم که که مربوط به تنظیم موقعیت پنجره در دسکتاپ باشه !
از اونجایی که یه همچین چیزیو در دیگر ide ها البته در ویندوز دیدم بسیار بعید اومد برام که اینجا هم نباشه البته در ویژگی geometry من به x و y برخوردم اما فعال نیستن !حتی بر فرض فعال بودن اونا چیزی نیستن که من میخوام یعنی center بودن .
ایا یه همچین ویژگی ای وجود نداره تو qt creator و باید بوسیله کد نتوشتن این کارارو بکنم یا باز چشمم ندیده؟ ;)
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
چیو میخوای center کنی!؟

برای جابجایی پنجره‌ی اصلی از دستور move استفاده کن
setGeometry هم باید جواب بده!
جفتشون از توی کد


Choqok developer
User avatar
pesarkhobeee
Posts
22
Karma
0
یکی از دوستانم این اموزش ها رو خونده بود و وقتی ازش نظرشو پرسیدم گفت : فرید خیلی خوبو جالبه اما اگه ادم بخواد یه برنامه بزرگ بنویسه اینطوری دخلش میاد!
منم گفتم بابا اینطوری نیس که ، این کارو کردیم تا یه بار با روال کلی اشنا شیم و در مرحله بعد با کلاسای کیوت باید اشنا شیم تا بدونیم چه ابزارهایی رو در اختیار داریم و اما در مورد برنامه بزرگ درست کردن هم باید بگم خیلی راحت با IDE های موجود که در قسمت اول معرفی کردم  مبشه برنامه رو ساخت.
برای همین معادل همون برنامه ای رو که در شیش قسمت اول ساختم با صرف یک ربع وقت با IDE قدرتمند Qt Creator میسازیم تا ببینیم چقدر سادس!
خوب این اموزش بیشتر تصویریه تا نوشتاری و فقط جاهایی که احساس کردم احتیاج داره توضیح دادم.

از منوی file گزینه new :
Image

Image

Image

Image

Image



خوب برنامه مون رو ایجاد کردیم و الان در محیط qt creator میبینیم که تمام فایلهای مورد نیازو خودش ساخته


Image

تنها تفاوت فایل های ساخته شده با فایل های خودمون اضافه شدن یک فایل به نام hello.ui هست که پسوند ui به معنای user interface هست !
یعنی برای ساختن رابط کاربری خیلی راحت رو این فایل کلیک میکنیم و بعد با چند تا کلیک تمام کنترل های مورد نیازمونو به برنامه اضافه میکنیمو ویژگیهاشونو تنظیم میکنیم.

Image


خوب کسانی که قبلا با محیط های توسعه مثل visual studio کار کردن این نما خیلی اشنا میاد ! همونطور که در عکس هم مشخصه خیلی راحت از پنل سمت چپ کافیه کنترل مورد نظرتو بندازید تو پنجره تون و بعد به صورت گرافیکی از پنل سمت راست ویژگیهاشو تنظیم کنید.
این قسمتو توضیح نمیدم چون خودتون با کمی دستکاری میتونید با این محیط اشنا شید و با کمی استفاده از انگلیسی دوران دبیرستانتون میتونید با خصوصیات کنترل هاتون بازی کنیدو یاد بگیرید.
خوب حالا موقشه یادمون بیاریم که تو برنامه ای که دستی نوشته بودیم چیا داشتیم ؟
یه دکمه (button) و یه برچسب (label) که بوسیله یه لایه (layout) مرتب شده بودن پس از پنل سمت چپمون دنبال این کنترل ها میگردیمو به پنجرمون اضافه میکنمیم .

Image


خوب حالا که کنترل ها رو اضافه کردیم سعی میکنیم که خصیه های کنترل هامونو طوری تنظیم کنیم که انتظار داریم!
ولی خوب اگه فقط برای دیدنه اگه همینطوری هم اضافه کنیم کار خواهد کرد.

Image

الان ما چهره برناممون رو درست کردیم بدون حتی یه خط کد نوشتن و تنها کافیه بگیم هر وقت روی کلیدمون کلیک شد متن بر چسبمون عوض شه! سیگنال و اسلات که یادتون هست؟
خوب برای اینکار کافیه رو کلید کلیک راست کنید و گزینه Go To slot رو بزنید با اینکار میتونید تمام سیگنالای ممکن رو ببینید و سیگنال مورد نظرتونو انتخاب کنید.
Image


خوب از سیگنال ها سیگنال کلیک شدنو انتخاب میکنم و خود برنامه من رو به قسمت ادیتور کدها و به تابعی که اسلات اون سیگنال محسوب میشه هدایت میکنه و کافیه تو اون تابع کد زیرو بزنم:

Code: Select all
QString str = QString::fromUtf8("افتتاح سایت زنجان لاگ مبارک باد <br> www.zanjanlug.org");
ui->label->setText(str);


اگه بخ.ام کدهای بالا رو تشریح کنم باید بگم در خط اول یک رشته به فرمت utf8    درست کردم به نام str و در خط دوم گفتم که در ui یک کنترل دارم به نام label که خصیصه text  رو میخام ست کنم و مساوی str قرار بدم.

نکته:
اینجا یه نکته وجود داره و اونم اینه اگه میخواهید این خط رو توسط قابلیت تکمیل خودکار ادیتور راحت بنویسد یک بار باید روی دکمه کامپایل برنامتون زده باشید تا این قابلیت رو داشته باشین اونم بخاطر اینه که فایل ui ما باید یک بار توسط uic (user interface compiler)    کامپایل بشه تا ما بتونیم در اتو کامپلت تمام کنترل های موجود و خصیصه هاشونو ببینیم!

خوب با همین دو تاکد برنامه ما به سر انجام میرسه و برای کامپایل کردن هم کافیه روی اون علامت دکه پلی سبز کردن سمت چپ بزنیم تا برناممون به سادگی هر چه تمام تر اجرا بشه!

Image



تبریک میگم.
اینم از اولین برنامه ما که توسط Qt Creator با سادگی هر چه تمام تر ساختیم . خیلی  راحت میتونیم با بازی کردن تو این محیط هر روز چیزای جذاب ترو بهتری بسازیم.
لذت ببرید

Last edited by pesarkhobeee on Thu Sep 10, 2009 10:39 pm, edited 1 time in total.
User avatar
Hosein-mec
Posts
82
Karma
0
من تصویری نمیبینم حتی با فیل ش ک ن ... میشه یه جا دیگه آپلود کنید ؟


Image
User avatar
pesarkhobeee
Posts
22
Karma
0
رسیدگی شد
خیلی ممنونم مشکل از سرور ما بود که برطرف شد ;)
موفق باشید
User avatar
pesarkhobeee
Posts
22
Karma
0

مشکل در نماش فایل xml

Tue Sep 15, 2009 12:03 pm
من یه فایل xml داشتم که توسط یه فایل xslt  براش یه اینتر فیس ساختم و خیلی راحت تو فایر فاکس و اپرا میبینمش ، اما وقتی امدم اونو تو مرورگر  داخلی qt نشون بدم اونو نشون نداد!
کل هدفم این بود که اطلاعات xml رو بتونم در برنامه qt نشون بدم که با این اتفاق نشد ! میدونم کیوت کلاسهایی برای کار با xml داره ولی پیچیده و گنگ بودن البته از نظر من!
شما پیشنهادی برای حل این مشکل ندارید؟
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
[quote=&quot;pesarkhobeee&quot;]
من یه فایل xml داشتم که توسط یه فایل xslt  براش یه اینتر فیس ساختم و خیلی راحت تو فایر فاکس و اپرا میبینمش ، اما وقتی امدم اونو تو مرورگر  داخلی qt نشون بدم اونو نشون نداد!
کل هدفم این بود که اطلاعات xml رو بتونم در برنامه qt نشون بدم که با این اتفاق نشد ! میدونم کیوت کلاسهایی برای کار با xml داره ولی پیچیده و گنگ بودن البته از نظر من!
شما پیشنهادی برای حل این مشکل ندارید؟
[/quote]

مشکلت چندان واضح نیست برا من

اما یه نگاهی به این سند بنداز:
http://doc.trolltech.com/4.5/qtxml.html
و این:
http://doc.trolltech.com/4.5/qdomdocument.html
باید کمکت کنن ;)


Choqok developer
User avatar
pesarkhobeee
Posts
22
Karma
0
سلام
من سعی کردم به توصیه جناب mtux عمل کنم و با سایتهای کنترل سورس کار کنم اما در سایت gitorious.org وقتی میام پروژه ای تعریف کنم به مشکل زیر بر میخورم:
You need to upload your public key first
Add a new public SSH key

Your public key
It's generally located in ~/.ssh/id_rsa.pub or ~/.ssh/id_dsa.pub. If you want to use multiple keys you'll have to add each of them seperately.
The key should be in the format of:
ssh-algorithm base64-content you@somehost


که مسیری رو که گفته میرم اما هیچی نیس! چطور میتونم برا این یه کلید ssh تعریف کنم؟
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
ssh-keygen
یک جفت کلید ssh برات می‌سازه!

کلید ssh برای امنیت بیشتر تبادل با سرور استفاده می‌شه! بجای استفاده از پسورد که چند کاراکتر هست و قابلیت دزدیده شدن و حدس زدنش بیشتره! به اینصورت که از اون به بعد، فقط با سیستمی که کلید خصوصی sshات روش هست می‌تونی با سرور کار کنی!
و این کلید خصوصی که با اسم ~/.ssh/id_dsa یا ~/.ssh/id_rsa خواهی داشتش! حکم کلید رو داره که اگه گمش کنی، یا دست کسی بیوفته می‌تونه ازش استفاده کنی ;)

این دو تا اسم dsa و rsa هم دو نوع مختلف از رمزنگاری هستن! زیاد مهم نیست، هرکدوم رو بسازی، کافیه کلید عمومی (public) رو به سایت بدی!

موفق باشی ;)


Choqok developer
yasergol
Posts
29
Karma
0
[quote=&quot;maour&quot;]
hw دیگه چه اسمیه !!!

بنا بر تجربه سعی کن اسم ها رو دست انتخاب کنی حتی اگه داری یک مثال و تست ساده مینویسی ;)

اسم فایل رو بزار main.cpp ;)

اولین دستوری که نوشتی درست نیست ، باید فایل .pro بسازی که ساختار درونیه ساده ای داره اما شما اومدی فایل آبحکت ساختی ! به روش gcc عمل کردی !

این سه تا دستور رو استفاده کن و به راحتی کامپایلش کن

qmake -project
qmake foldername.pro
make
[/quote]
من همین دستورات رو زدم ولی ارور میده
Code: Select all
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i586 -mtune=generic -fasynchronous-unwind-tables  -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -DQT_THREAD_SUPPORT -I/usr/lib/qt-3.3/mkspecs/default -I. -I. -I/usr/lib/qt-3.3/include -o aa.o aa.cpp
aa.cpp:1:19: error: QtDebug: No such file or directory
aa.cpp: In function ‘int main()’:
aa.cpp:4: error: ‘qDebug’ was not declared in this scope
make: *** [aa.o] Error 1

البته نگید این دیگه چه کدیه چون توی Qt Creator کار میکنه
Code: Select all
#include <QtDebug>
int main( )
{
    qDebug() << "Hello Qt World!";
    return 0;
}
yasergol
Posts
29
Karma
0
وقتی میخواید وارد ویندوز بشید اونجا که پسورد رو باید وارد کنید یه چیزی شبیه این نوشته Enter password که وقتی روش کلیک میکنیم میره
میخوام بدونم چجوری میشه برای QLineEdit هم همچین چیزی درست کنم؟؟؟؟


لطفا کمکم کنید؟؟؟؟؟؟!


Bookmarks



Who is online

Registered users: bartoloni, Bing [Bot], Google [Bot], Sogou [Bot], Yahoo [Bot]