شروع کار با کیوت

آرام درخشانی 1395/9/16 316

شروع کار با کیوت

دوستای خوب و عزیزم سلام
حالتون چطوره؟ ‏
خب دیگی بریم سراغ درسمون: آماده‌اید؟! کمربنداتون رو محکم بستید؟! بسیار خب. ‏
در جلساتی که در قرون وسطی با هم داشتیم مختصری از سی++، شی‌ء گرایی و چیستی کیوت و نحوه‌ی کامپایل برنامه‌هاش ‏رو با هم بررسی کردیم. امروز جلسه‌ی ششم رو خواهیم داشت.‏
اگه سیلابس درس رو یادتون مونده باشه(پایین گذاشتم)، رسیدیم به «شروع کار با کیوت». در این جلسه‌ی کوتاه، مروری خواهیم ‏داشت برا انواع برنامه‌هایی که با کیوت میشه نوشت و نیز خروجی‌هایی که میشه برای پلتفرم‌های مختلف گرفت. یادمون نرفته که ‏قول داده بودیم قبل از شروع جلسه ششم، مختصری از مبحث اشاره‌گرها رو هم بگیم. پس با همون شروع میکنیم:‏

اشاره‌گرها(‏Pointers‏)‏

برای درک اینکه اشاره‌گرها چیستند باید چند نکته رو دونست:‏
1- وقتی یک برنامه اجرا می‌شود، سیستم عامل بطور خودکار(و طبق الگوریتم‌های داخلی‌ای که دارد) فضایی از حافظه را ‏بصورت تصادفی انتخاب کرده و در اختیار آن قرار میدهد تا بتواند متغییرهایش را در آن ذخیره کند. هر متغییر در یک ‏خانه از حافظه(مثل یک واحد آپارتمانی) ذخیره می‌شود. هر خانه‌ی حافظه آدرس مختص به خودش را دارد(مثل پلاک ‏خانه و سپس شماره‌ی طبقه و واحد). پس در واقع هر متغییر هم آدرس مختص به خودش را خواهد داشت. ‏
2- از کجا بدانیم که متغییرمان در کجای حافظه(کوچه، پلاک، واحد) ذخیره شده؟ در سی++ اینکار خیلی راحته. کافیه ‏علامت ‏&‏ رو قبل از اسم متغییر بنویسید تا آدرس اون رو(به جای محتویات) برگردونه. مثلا قطعه کد زیر آدرس جایی ‏که متغییر ‏a‏ درحافظه ذخیره شده رو بر میگردونه:‏

 

int a = 10;‎
cout « &a;‎

‏3- یک سوال مهم: اگر بخواهیم یک متغییر را در سراسر برنامه مورد استفاده قرار دهیم، چون حوزه‌های دید(‏scope‏) ‏زیادی در برنامه وجود دارد(مثل کلاس‌ها و توابع و...) و ممکن است یک متغییر در درون یک کلاس، برای کلاس ‏همسایه قابل مشاهده نباشد، پیشنهاد شما چیست که مجبور نشویم این متغییر را در جاهای مختلف کپی کنیم و مقدار زیادی ‏حافظه برای یه متغییر ناقابل مصرف نشود؟  ‏
یک کم فکر کنید...یهو به دنیای اشاره‌گرها خوش آمدید! ‏
ببینید کل بحث اشاره‌گر، بحث مدیریت حافظه است. با یک مثال سعی میکنیم درک کنیم که اشاره‌گر به چه دردی میخوره. ‏فرض کنید شما به سلامتی زدید تو کار گزفروشی! یک مغازه‌ی گزفروشی هم اجاره کردید. برای معرفی خودتون به ‏مشتری‌ها مایلید چند نمونه گز رو به هر رهگذری که از خیابان نزدیک مغازه‌تون رد میشه تعارف کنید. مسلما به صرفه نیست ‏که کل مغازه رو بیارید وسط پیاده‌رو! راه حل چه خواهد بود؟ یک نفر رو استخدام می‌کنید که یک سینی گز دستش بگیره و به ‏مغازه‌ی شما «اشاره» بکنه. ‏
مزیت اینکار چیه؟ اولا مشتری با نگاه به سینی اون آقا/خانم می‌فهمه که «جنس» یا نوع کسب و کار شما گزفروشیه. ثانیا با ‏پرسش از اون آقا/خانم میتونه به «خود گزفروشی» دسترسی پیدا کنه و چند کیلویی خرید کنه.  ‏
اشاره‌گر در واقع نقش همون آقا/خانم رو داره.‏

به یک زبان دیگه: اشاره‌گر، یک متغییر مخصوصه که در اون فقط آدرس متغییرهای دیگه رو ذخیره‌ میکنیم. جنسش هم از ‏جنس همون محتویاته(گزهای روی سینی با گزهای مغازه باید یکی باشه). ‏
مثال: یک متغییر ‏pi‏ داریم که میخواهیم در تمام طول برنامه ازش استفاده کنیم. مقدارش هم از نوع ‏float‏ است و برابر ‏‎3.14‎‏ ‏‏. حال میخواهیم آدرس این متغییر را در یک متغییر دیگه مثل ‏pi_address‏ ذخیره کنیم و بعد اشار‌ه‌گر رو چاپش کنیم. ‏

float pi = 3.14;‎
float * pi_address = π‎
cout << “The Pi value is = ” << pi << “ and it’s address is = ” << ‎pi_address;‎

   ‎
خب. به نظرتون خروجی ‏pi_address‏ چی میشه؟ یه عدد مثل 6503473 . این چیه؟ این همون آدرسه است. آدرس چی؟ ‏آدرس متغییر مادر یعنی ‏pi‏ یعنی جایی که 3.14 و گزها هستند! پس ‏pi_address‏ یک اشاره گره.‏
همونطور که دیدید برای تعریف اشاره‌گر به یک متغییری مثل ‏pi‏ باید یک متغییر جدید تعریف کرد از جنس همون ‏pi‏ و یک ‏ستاره قبل اسم متغییر گذاشت. سپس در مقداردهی اشاره‌گر باید دقت کرد که حتما به آن آدرس داده شود. چرا؟ چون ‏‏«خوراک اشاره‌گر آدرس است». برای دسترسی به آدرس یک متغییر مثل ‏pi ‎‏ هم باید نوشت ‏&pi‏ .‏
سوال: چگونه می‌توانیم محتویات یک متغییر را از طریق اشاره‌گر بدست بیاوریم؟ ‏
جواب:‏

float pi = 3.14;‎
‎float * pi_address = &pi;‎
‎cout << "the address of pi is = " << pi_address << " and the value is = ‎‎" << *pi_address;‎


‎    ‎
نکته چی بود؟ نکته این است که هرگاه خود اشاره‌گر را بعد از تعریف، چاپ(یا فراخوانی) کنیم، یک آدرس را بر میگرداند، ‏اما هر موقع جلوی آن ستاره بگذاریم و چاپش کنیم، محتویات آن خانه‌ای که به آن اشاره میکند را بر میگرداند. یعنی در این ‏مثال ‏‎3.14‎‏ را بر میگرداند. جالبه نه؟
از همین روش برای مقدار دهی به خانه‌ی مورد اشاره هم میتوان استفاده کرد. مثلا در این مثال بالا، میتوان از طریق اشاره ‏گر، محتویات متغییر ‏pi ‎‏ را تغییر داد. ‏
اینطوری:‏

*pi_address = 4.16;‎

حالا اگر متغییر ‏pi ‎‏ را چاپ کنید می‌بینید که شده ‏‎4.16‎‏ ‏

حافظه‌ی پویا با کلمات کلیدی ‏new‏ و ‏delete ‎‏ ‏
از کاربردهای مهمی که اشاره‌گرها دارن دسترسی پویا به حافظه است. یعنی چی؟ یعنی درخواست تخصیص ‏فضا و نیز حذف و آزادسازی فضا از سیستم عامل.‏
به این مبحث نمی‌رسیم. واگذار میکنم به خودتون. خیلی آسونه و بسیار مهم.‏

شروع کار با کیوت

در یک طبقه‌بندی کلی، ما 5 نوع برنامه کلی میتونیم با کیوت تولید کنیم:‏
‏1-‏  برنامه‌های ‏C++‎‏ یا اصطلاحا ‏Pure C++‎‏ که همون سی++ خودمونه و لاغیر
2- برنامه‌های کنسول(که توی محیطی شبیه داس/خط فرمان‎/‎‏ یا ‏CLI‏ اجرا میشن): در این نوع‌برنامه‌ها میتوان از ‏کتابخانه‌های غیربصری کیوت(مثل ساختمان داده‌های منحصر بفرد، کلاس‌های شبکه، کامپایل چندسکویی و...) استفاده ‏کرد.‏
‏3-‏  برنامه‌های ‏UnitTest‏ : که ازشون برای تست یک قابلیت یا کلاس استفاده میشه و زیرشاخه‌ی کنترل کیفیت(‏Quality ‎Assurance‏) است.‏
‏4-‏  برنامه‌های ‏Qt Widget‏ : که همون برنامه‌های معمولی ویندوز، لینوکس یا مک هستند. شامل چندین پنجره و منو و نوار ‏وضعیت و...‏
‏5-‏  برنامه‌های ‏Qt Quick‏ : که نوع مدرن برنامه‌ها هستند و میشه بصورت برنامه‌های موبایل(ظاهری شبیه تلگرام ویندوز)‏ باهاش درست کرد.
ما به تناسب وقتمون در این دوره‌ی کوتاه، بیشتر روی 4 و 5 بحث خواهیم کرد.‏

امروز برای دست گرمی، یه برنامه‌ی ‏Hello World ‎‏ مینویسم با هر کدوم. از جلسه بعد سعی میکنیم متمرکز بشیم روی ‏برنامه‌های ‏QtQuick‏ که به هم لحاظ ظاهر جذابند، هم به لحاظ کارکرد عالین و همم آینده‌ی خوبی دارن.‏

برنامه‌های ‏QtWidget

برنامه‌های QtWidget برنامه‌ی ویجت‌محور هستن. یعنی تکست باکس داره، عکس میذاری، منو داره و... دقیقا شبیه یک برنامه‌ای مثل ‏Notepad‏ ‏یا ‏Paint‏ . ‏

لطفا کیوت را از خواب بیدار کرده و اجرا کنید.‏
مسیر زیر را طی کنید:‏

 

File -> New File or Project

آموزش کیوت


در پنجره‌ی باز شده، ذیل دسته‌بندی ‏Projects‏ گزینه‌ی ‏Application‏ را انتخاب کنید. سپس در سمت راست، گزینه‌ی ‏Qt ‎Widgets Application ‎‏ را انتخاب و کلید ‏Choose ‎‏ را بزنید(شکل ۱). ‏

آموزش کیوت


پنجره‌ی جدید باز می‌شود که در قسمت اول آن(‏Location‏) از شما می‌خواهد یک نام و مسیر ذخیره‌سازی برای پروژه‌تان انتخاب ‏کنید(شکل ۲). سپس ‏Next‏ را کلیک کنید. ‏

آموزش qt


در صفحه‌ی بعدی(‏Kits‏) پلتفرم‌هایی که می‌خواید براشون خروجی بگیرید(مثل اندروید و...) رو انتخاب کنید. مثلا من فقط ‏ویندوز(‏Desktop‏) را انتخاب کرده‌ام(شکل ۳). کلید ‏Next‏ را بزنید. ‏

آموزش QT


در صفحه‌ی جدید(‏Details‏) اسم کلاس‌ها(فایل‌های ‏cpp ‎‏ و ‏h‏) رو تنظیم میکنید. فعلا تغییری در این صفحه ندهید(شکل ۴). کلید ‏Next ‎‏ را بزنید. ‏

آموزش کاربردی کیوت


در صفحه‌ی جدید(‏Summary‏) امکانات مدیریت پروژه مثل کنترل ورژن(‏Version control‏) با ‏Git‏ و ... را میتونید تنظیم ‏کنید(شکل ۵). ‏Finish ‎‏ را کلیک کنید.‏

آموزش کیوت


صفحه‌ای حاوی چند خط کد ظاهرا می‌شود(شکل ۶) که فایل کد ‏mainwindow.cpp‏ است. این فایل عملیات مربوط به تنها ‏پنجره‌ی موجود در برنامه‌ی ما را مدیریت میکند(بعدا میتوانیم پنجره‌های دیگر را نیز اضافه کنیم)‏

آموزش کامل کیوت


برای دیدن شکل و شمایل این پنجره در قسمت سمت چپ روی ‏Forms‏ و سپس زیر آن روی ‏mainwindow.ui‏ دابل کلیک کنید. ‏به‌به! پنجره‌هه اومد(شکل ۷).‏‎ ‎


در قسمت سمت چپ، اسکرول را پایین بیاورید تا به ابزار ‏Label‏ برسید. آنرا با ماوس کشیده و روی پنجره بیندازید.‏
روی آن دابل کلیک کنید و بنویسید«سلام! چه جالب!! موفق شدم!»(شکل ۸)‏


‏ حالا کلید ‏ctrl+R‏ را روی صفحه کلید بزنید تا برنامه اجرا شود.(پنجره‌ای مثل شکل ۹ باز می‌شود، ‏save all‏ را بزنید تا تغییرات ‏ذخیره شود).

آموزش کیوت


برنامه با موفقیت ساخته شد.

برنامه‌های ‏QtQuick

این‌ها برنامه‌هایی هستند مدرن و زیبا مثل تلگرام و واتس‌اپ در ویندوز، یا حتی در موبایل. قابلیت‌های بسیار زیبا و جالبی دارن ‏مثل:‏

‏-‏Javascript
‏-‏Html
‏-‏Css
‏-‏QML
‏-‏MVC
‏-‏و...‏


که همونطور که قبلا هم گفتیم با قدرت ‏C++‎‏ ترکیب میشن.‏


برای ساخت یک چنین برنامه‌ای، همون مسیر بالا رو طی کنید منتها در شکل ۱، گزینه‌ی ‏QtQuick Application‏ را بزنید. بقیه‌‌ی ‏مراحل را فعلا ‏Next‏ بزنید(شکل ۱۱).‏

می‌بینید که ساختار کدها کلا فرق کرده و شبیه کدهای جاوااسکریپت شده(فلفل نبین چه ریزه). بعدا انشاءالله با قابلیت‌های ‏شگفت‌انگیز این نوع برنامه‌ها بیشتر آشنا میشیم.‏

برای دیدن فرم ظاهری، در قسمت سمت چپ، روی ‏Resources‏ دابل کلیک کرده و سپس روی ‏qml.qrc‏ سپس روی ‏‎/‎‏ و بعد از ‏آن روی ‏MainForm.ui.qml‏ دابل کلیک کنید(شکل ۱۲).‏
می‌بینید که محیط طراحی قدرتمند ‏QML‏ با ظاهری خشن و تیره خودشو نشون میده! اینجا جای هنرنمایی ما خواهد بود!‏‎ ‎شبیه محیط ‏‎3D Max‎‏ و ایناست نه؟!‏
در وسط صفحه روی مربع بزرگ سفید، متنی هست تحت عنوان ‏Hello World!‎‏ روی آن دابل کلیک کنید و همون متن خودمون ‏‏«سلام! چه جالب!! موفق شدم!» رو بنویسید و کلید ‏ctrl+R‏ را بزنید تا اجرا شود. اگر پنجره‌ی شکل ۹ باز شد مجددا ‏save all‏ را ‏بزنید. ‏
برنامه با موفقیت ساخته و اجرا میشه(شکل ۱۳). همانطور که می‌بینید ظاهر بسیار شسته رفته‌تر و تمیزتری داره از برنامه‌های ‏ویجت‌محور. در واقع این نوع برنامه‌ها در حد یک بوم نقاشی(و حتی خیلی بیشتر) قابل انعطاف و سفارشی‌سازی است.‏

خب برای این جلسه و دست‌گرمیِ شروع، فکر کنم کافی باشه. تا جلسه‌ی دیگه همه‌تون رو به خدای بزرگ می‌سپارم.‏
می‌بینمتون

دیگران گر همه رفتند خدا را، تو مرو...

آموزش کیوت


شکل ۱۲

 

آموزش QT


شکل ۳

 

آموزش کیوت


شکل ۱۴

دانلود PDF قسمت ششم کیوت

قسمت قبلی