موقعی که شما نسخهء اپن سورس کیوت رو نصب میکنید و MinGW هم باهاش نصب میشه، یکسری ابزار و کامپایلر روی سیستم شما نصب میشه؛ شامل مجموعه کامپایلر معروف gcc. بنابراین شما نه تنها کیوت رو دارید بلکه مجموعه ای از ابزارهای ساخت برنامه و کامپایلر رو هم دارید که مستقلا قابل استفاده هستن و وابستگی به کیوت ندارن. بنابراین میتونید با این کامپایلرها، برنامه های به زبان سی و سی++ خودتون رو هم کامپایل کنید و از کتابخانه های استاندارد این زبانها هم که در پکیج MinGW موجود هستن استفاده کنید.
توضیح اینکه کدی که این کامپایلرها تولید میکنن کد اجرایی 32 بیتی ویندوز هست و نه کد 16 بیت تحت داس. بنابراین شما از امکانات سیستم عامل 32 بیتی استفاده میکنید و محدودیت های محیط DOS رو ندارید. نباید فکر کنید هر برنامه ای که در خط فرمان کامپایل یا اجرا میشه و کامپایلرش رابط گرافیکی نداره مربوط به عهد بوق و داس 16 بیتی درپیت میشه!!
خب این نکته ها رو برای چی گفتم؟ برای اینکه هم جالب و آموزنده هست و هم اینکه موقع کار با کیوت نظر به اینکه بهرحال با زبان ++C کار میکنید ممکنه نیاز به نوشتن و تست برنامه های خارج از کیوت به زبان سی++ داشته باشید و در اینصورت میتونید با فرمانهایی مثل g++ test.cpp راحتتر و سریعتر و مستقل از پروژهء کیوت جاری، اون برنامه ها رو کامپایل کنید. من معمولا برنامه های کوچکی برای تست کردن بعضی جنبه های زبان سی++ که به دونستن اونها در کیوت احتیاج داشتم می نوشتم.
دقت کنید که با اجرای فرمانی مثل g++ test.cpp، فایل اجرایی حاصل از عملیات کامپایل با نام a.exe در دایرکتوری جاری ایجاد میشه، مگر اینکه ما با آپشنهای خط فرمان نام دیگری رو براش تعیین کرده باشیم.
برای کامپایل برنامه های به زبان C هم از فرمان gcc test.c استفاده کنید (نام فایل سورس شما میتونه هرچیزی باشه که باید بجای test.c قرار بدید).
خب ما اولین برنامهء کیوت خودمون رو مینویسیم و به این روش بحث کیوت رو ادامه میدیم.
برنامهء ما همون برنامهء معروف Hello World هست که همهء برنامه نویسها در هر زبان برنامه نویسی ای باهاش آشنا هستن. منتها این بار محیط و رابط برنامهء ما گرافیکیه و زرق و برق و کارایی اضافه ای داره:
این کد رو داخل فایلی بنام main.cpp قرار بدید:
کد :
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton hello("Hello world!");
hello.show();
return app.exec();
}
انتخاب نام main.cpp اجباری نیست اما معمولا در برنامه های کیوت فایلی رو که حاوی تابع main هست (برنامه نویسان سی و سی++ این تابع رو میشناسن) اینطوری نامگذاری میکنیم که مشخص و برای پیدا کردن راحت باشه. در برنامه های کیوت این تابع و فایل معمولا خیلی مختصرتر از فایلهای سورس دیگه که محتوی کلاسها و پیاده سازی اونها و جزییات کدهای عملیاتی برنامه هستن هست و گاه چندخطی بیشتر نیست. اما برنامه در همین چند خط و از این فایل و با تابع main شروع میشه. تابع main در زبان سی و سی++ نقطهء ورود خودکار و اجرای برنامه توسط سیستم عامل هست.
بخاطر ساده و کوتاه بودن این برنامه و تازگی ورودمون به محیط کیوت، خط به خط این برنامه رو توضیح میدم:
- خط اول تعریف کلاس QApplication رو اینکلود میکنه که ما نیاز داریم در هر برنامهء کیوت با رابط گرافیکی و همینطور بخاطر استفاده از خیلی از کلاسها و امکانات دیگه که به وجود یک شیء QApplication در برنامه وابسته هستن یک نمونه از اون رو در برنامه و در همون خطوط ابتدایی داشته باشیم.
- خط دوم تعریف کلاس QPushButton رو اینکلود میکنه که تولید کنندهء دکمهء فشاری یا همون Push Button متداول هست که همه جا دیده میشه (مثلا دکمهء Ok در کادرهای ویندوز و غیره). ما میخوایم Hello world خودمون رو بعنوان متن روی این دکمه نمایش بدیم. استفاده از Push Button بخاطر مناسب بودنش برای این متن و آماده و راحت بودن برای استفاده هست (مثلا نیازی به تعیین سایزش بطور دستی نداریم و خودش بطور خودکار تنظیم میکنه).
- خط سوم (خطهای خالی رو نمیشمارم) که معرف حضور تمام برنامه نویسان سی و سی++ هست و تعریف استاندارد تابع اصلی برنامه های سی و سی++ هست که ضمنا تعیین کردیم تا اطلاعات مربوط به آرگومانهای خط فرمان برنامه رو هم در متغییرهای مورد نظر ما در دسترس برنامهء ما بذاره. هرچند ما در این برنامه آرگومان خاصی نداریم اما بخاطر اینکه ایجاد یک نمونه از QApplication در برنامه نیاز به پاس کردن آرگومانهای خط فرمان داره اینکار رو کردیم.
- خط چهارم یک نمونه یا شیء از کلاس QApplication برای ما ایجاد میکنه که معمولا اولین دستور بیشتر برنامه های کیوت هست. ما آرگومانهای برنامه رو ابتدا به این شیء پاس میکنیم تا کیوت آرگومانهایی رو که خودش میشناسه از میان اونها انتخاب کنه و برداره (مثلا آرگومانی که تعیین میکنه استایل گرافیکی برنامه چی باشه، شبیه ویندوز XP یا Mac OS X که کاربر برنامه میتونه در خط فرمان به برنامه پاس کنه). بقیهء آرگومانها دراختیار برنامهء ما هست که اگر خواستیم میتونیم ازشون استفاده کنیم (مثلا اسم فایلی که برنامهء ما کاری روش انجام میده). کیوت آرگومانهایی رو که مال خودشه از متغییرهای argc و argv حذف میکنه.
- خط پنجم یک نمونه از کلاس دکمهء فشاری ایجاد میکنه و چون ما رشتهء Hello world رو به Constructor این کلاس پاس کردیم متن روی این دکمه عبارت Hello world خواهد بود. اغلب کلاسها و اشیاء گرافیکی در کیوت هنگام تعریف پارامترهای مختلفی رو میتونن بگیرن که بسته به نوع و تعداد این پارامترها استفاده های مختلفی دارن و خصوصیات و کاربردهای مختلفی رو باعث میشن.
- خط ششم تابع show دکمهء گرافیکی ما رو اجرا میکنه که به زبان ساده بهش میگه قابل مشاهده باش. اشیاء گرافیکی ما بعد از تعریف شدن تا زمانیکه صریحا مشخص نکرده باشیم نمایش داده بشن، نامریی خواهند بود.
- خط هفتم تابع exec نمونهء QApplication برنامهء ما رو که در اینجا اسمش app هست اجرا میکنه. تازمانیکه ما این تابع رو روی نمونهء QApplication برنامهء خودمون اجرا نکردیم برنامهء کیوت وارد Event Loop اصلی برنامه نمیشه و کاربر قادر به کار کردن با برنامه نیست و معمولا هیچ جزء گرافیکی از برنامه هم نمایش داده نمیشه. درواقع این تابع مثل استارت اتومبیل یا زنده شدن یک کالبد بیجان هست که اگر انجام نشه عملکرد طبیعی شروع نمیشه و کاری صورت نمیگیره.
معمولا اجرای کدهای وابسته به کیوت در برنامهء ما زمانی که برنامه از این تابع برمیگرده تمام شدن و ما کد دیگری هم مستقل از کیوت برای اجرا نداریم و بنابراین مقداری که این تابع برمیگردونه بعنوان مقدار برگشتی برنامهء سی++ موقع خاتمه به سیستم عامل و محیط کاربری برگردونده میشه (با دستور return در سی++).
توضیحات خود برنامه تمام شد.
حالا برای کامپایل برنامه پس از ایجاد فایل main.cpp باید چند فرمان رو در خط فرمان اجرا کنیم. پس خط فرمان کیوت (Qt Command Prompt) رو از منوی استارت اجرا کنید؛ سپس دایرکتوری جاری خط فرمان رو باید به دایرکتوری ریشهء محتوی برنامه و پروژهء کیوت خودمون تغییر بدیم. من اینکار رو با کشیدن آیکون فولدر برنامه (از گوشهء آدرسبار پنجرهء ویندوز اکسپلورر) به پنجرهء خط فرمان و سپس اضافه کردن دستور cd بعلاوهء یک فاصله در ابتدای مسیر فولدر انجام میدم. یادتون باشه اگر فولدر برنامهء شما در درایوی بغیر از درایو C ویندوز هست باید دستور :d رو هم بعد یا قبل از تغییر دایرکتوری جاری اجرا کنید تا خط فرمان در درایور مورد نظر قرار بگیره، که بجای d باید نام درایور مورد نظر خودتون رو قرار بدید.
علت نیاز به بودن در دایرکتوری برنامه این هست که برنامه ها و دستورات لازم برای مدیریت و کامپایل پروژه های کیوت ما روی فولدر جاری کار میکنن و اون رو بعنوان فولدر ریشه ای که محتوی تمام اجزای پروژهء ما هست درنظر میگیرن و توی اون دنبال فایلهای مورد نظر گشته و تمام عملیات رو روی فایلهای مورد نظر خودشون در این فولدر انجام میدن؛ این کار ما رو هم راحتتر میکنه چون نیازی نداریم برای هر فرمان مسیر فولدر خاصی رو هم وارد کنیم.
حالا دستور qmake -project رو اجرا کنید.
این دستور باعث میشه یک فایل پروژهء کیوت (فایلی با پسوند pro) در فولدر ما ایجاد بشه که محتوی مشخصات فایلهای پروژهء ما هست و به فرمانهای بعدی میگه که روی کدام فایلها باید کار کنن و پروژه و برنامهء ما چه فایلها و ساختاری داره. ما در اینجا از قابلیت تولید خودکار فایل پروژهء اولیه توسط برنامهء qmake که جزیی از ابزارهای کیوت هست استفاده کردیم، ولی میتونیم فایلهای پروژه رو خودمون هم ایجاد کنیم و در اونها مشخصات فایلها و فرامین مورد نظر رو بنویسیم. ضمنا برای برنامه های گسترده تر ما اغلب نیاز داریم که مشخصات/فرامین دیگری رو که برنامهء qmake قادر به تشخیص خودکار اونها نیست و برنامهء ما نیاز به استفاده از اونها داره، به این فایل اضافه کنیم. به چند مورد مهم و پرکاربرد از این فرامین در آینده اشاره خواهیم کرد.
فرمان qmake رو اجرا کنید.
این فرمان مراحل نهایی و اصلی آماده سازی برای کامپایل برنامهء ما رو انجام میده و یکسری فولدر و فایلهای محتوی دستورات و پیکربندی مربوط به فرایند کامپایل خودکار (عمدتا Make File ها) رو به پروژهء ما اضافه میکنه.
فرمان سوم یا فرمان آخر که درصورت بدون اشکال بودن و کامل بودن اجزاء برنامهء ما فایل اجرایی تحویل ما میده فرمان mingw32-make release هست.
این فرمان برنامهء make پکیج MinGW رو که اسم فایلش mingw32-make هست اجرا میکنه که این برنامهء mingw32-make فایلهای برنامهء ما رو بررسی کرده و اگر فایلی تاریخ ویرایشی جدیدتر از آخرین کامپایل پروژهء کیوت ما رو داشت، بخشهای لازم رو کامپایل مجدد میکنه و نهایتا یک فایل اجرایی جدید تحویل ما میده. البته اگر همه چیز بخوبی پیش بره و نقص و اشکال کد نویسی ای درکار نباشه. بعنوان اطلاع باید بگم که برنامهء make در مراحل اصلی کامپایل، برنامهء کامپایلر ++g رو با آپشنها و آرگومانهای خط فرمان لازم فراخوانی میکنه.
make خودش یک کامپایلر نیست، اما برنامهء مهم و پیچیده ای برای مدیریت پروژه ها در ارتباط با کامپایل خودکار هست که هرچیزی رو و هر فایل سورس از میان فایلهای سورس برنامهء ما رو فقط وقتی که لازم هست کامپایل مجدد میکنه و پیکربندیهای لازم رو نسبت به پلتفرم و تنظیمات سیستم عامل انجام میده و نهایتا دستورات طولانی و متعدد لازم برای کامپایل و ترکیب اجرای برنامه رو یکی پس از دیگری بطور خودکار برامون اجرا میکنه و ما رو از این عمل شاق و پیچیده معاف میکنه.
برنامهء make خیلی مهمه و بخصوص روی سیستم عاملهای گنو/لینوکس و یونیکسی ها خیلی معروف و پرکاربرد هست و میشه گفت اکثر پلتفرمهای دنیا از این روش برای پیکربندی و مدیریت خودکار ساخت و کامپایل نهایی برنامه ها استفاده میکنن (هرچند مثلا بعلت پشت صحنه بودن به دید کاربران و حتی برنامه نویسان نیاد).
علت پاس کردن آرگومان release به برنامهء make این هست که میخوایم از ابتدا یک فایل اجرایی عادی تولید بشه. چون حالت عادی پیشفرض میتونه تولید یک فایل اجرایی از نوع مخصوص Debug (هم) باشه که این نوع فایل اجرایی هم زمان بیشتری برای کامپایل میبره و هم حجمش خیلی بیشتر و سرعتش کمتر هست و بنابراین فایل اجرایی نهایی برای کاربرد عملی بحساب نمیاد و فقط برای مراحل توسعه و باگ یابی در برنامه کاربرد داره. هرچند خودم هرگز از این نوع فایلها استفاده نکردم و فکر میکنم در بیشتر کاربردهای ما برنامه نویسان عادی، نیازی بهش نیست.
حالا که ما برناممون رو با موفقیت و بدون خطا کامپایل کردیم، فایل اجرایی تولید شده باید در دایرکتوری ای بنام release در دایرکتوری اصلی پروژه قرار داشته باشه و بنابراین با توجه با اینکه خط فرمان ما در دایرکتوری ریشهء پروژه قرار داره ما میتونیم با فرمان release/project.exe برناممون رو اجرا کنیم. البته به مشخص کردن پسوند exe نیازی نیست ولی برای خوانایی و تفکیک خیلی خوبه. ضمنا نام فایل اجرایی تولید شده برگرفته از نام دایرکتوری پروژه خواهد بود؛ مثلا اگر ما در فولدری بنام test برناممون رو کامپایل کردیم، نام فایل اجرایی تولید شده test.exe خواهد بود؛ البته اگر در فایل پروژه (فایلی که گفتیم پسوندی pro داره) نام دیگری توسط برنامه نویس برای فایل اجرایی تولید شده تعیین نشده باشه.
نهایتا برای راحتی کار کسانی که به امکانات خط فرمان وارد نیستم بگم که میتونید برای سرعت و راحتی اجرای این فرمانها از امکانات خط فرمان مثل تکمیل خودکار نام فایلها و دایرکتوریها استفاده کنید. مثلا اگر ما حرف r رو تایپ کنیم و بعد کلید Tab رو بزنیم، احتمالا اولین گزینه ای که بطور خودکار در خط فرمان برامون تایپ میشه حروف release خواهد بود که این ما رو از تایپ تمامی این حروف و اشتباهات احتمالی راحت میکنه. با زدن کلید تب در بارهای دیگر گزینه های ممکن دیگر درصورت وجود برامون تایپ میشن.
ضمنا مورد دیگه اینه که فرمانهایی رو که قبلا تایپ کردیم میتونیم با کلیدهای مکان نمای بالا و پایین دوباره ظاهر کنیم و نیازی نیست اونها رو مجددا تایپ کنیم.
یک نکتهء دیگه که باید بگم اینه که فایل اجرایی شما بخاطر نیاز به چند فایل dll کیوت، با دوبار کلیک روی اون اجرا نمیشه و فعلا فقط به اینصورت از طریق خط فرمان کیوت تستش کنید تا بعدا که بگم باید برای پکیج کردن نهایی برنامه چکار کرد.
راستی موقعی که فرمان مربوط به عملیات make رو اجرا میکنید تمام خطاهای کدنویسی برنامهء شما درصورت وجود درمیان پیامهای خروجی درج میشن (چون make فرمانهای مربوط به کامپایل با ++g رو اجرا میکنه) که شما معمولا باید اولین خطای رخ داده در فرایند کامپایل و پیام مربوط به اون رو درمیان انبوه متون تولید شده موقع اجرای make پیدا کنید تا بتونید به خط مورد نظر در فایل سورس مورد نظر رفته و اشکال رو کشف و برطرف کنید. خب این نیاز به کمی مهارت و سواد و زبان انگلیسی داره!
ضمنا گاهی پیامهای خطا بیش از حد نامفهوم هستن و فقط شاید حرفه ایها و خبره های برنامه نویسی و رایانه ازشون سردربیارن. ولی با پیدا کردن شمارهء خط و فایل و چک کردن منطق کد و ترتیب دادن یکسری تست و تغییر بالاخره اشکال پیدا و رفع میشه. بهرحال برنامه نویسی جدی همینه! و زبان سی++ هم یک زبان حرفه ای هست که مقداری در این وادی خشن و سخت تر از زبانهای جدیدتر هم هست، اما این برنامه نویسان مسلط و باسواد رو نمیترسونه و از کار باز نمیداره.
نکتهء دیگر اینکه، اگر بعد از تلاشهای متعدد هنوز با پیامهای ناشناخته و اشکالات ظاهرا برطرف نشدنی مواجه شدید سعی کنید تمام فایلهای اضافی بطور خودکار تولید شده رو (بغیر از فایل پروژه با پسوند pro) دلیت کنید و ساخت برنامه رو از فرمان دومی که در اینجا مطرح شد (qmake) شروع کنید. چون گاهی بخصوص در عملیات و تغییرات متعدد و پیچیده در جریان توسعهء برنامه اشکالات و گیرهایی در این ارتباط پیش میاد که با حذف و تولید مجدد این فایلها برطرف میشن.
یعنی فقط فایلها و دایرکتوریهایی رو باقی بگذارید که تا مرحلهء تولید فایل پروژه موجود بودن. شامل سورسها و فایلهای جانبی شما.
ضمنا هروقت فایل سورس یا بعضی فایلهای جانبی جدیدی رو به برنامهء خودتون اضافه میکنید لازم هست که مشخصات چیزهای جدیدا اضافه شده، به فایل پروژهء برنامه اضافه بشن که اینکار یا با اجرای مجدد qmake -project انجام میشه و یا بطور دستی. بهرحال یادتون باشه با اجرای مجدد qmake -project، محتویات قبلی فایل پروژه و بنابراین چیزهایی هم که ممکنه شما بعدا بطور دستی به اون اضافه کرده بوده باشید پاک میشن.
یکبار دیگه فرمانهای لازم برای کامپایل رو بطور یکجا درج میکنم:
کد :
qmake -project
qmake
mingw32-make release
- فرمان اول فایل مشخصات فایلهای پروژه و تنظیمات خاص لازم در بعضی موارد رو که بعدا توسط برنامه نویس بطور دستی اضافه میشن ایجاد میکنه.
- فرمان دوم دایرکتوریها و Make file های لازم که حاوی دستورات لازم برای عملکرد برنامهء make هستن رو ایجاد میکنه.
ایجاد Make file هم عمل نسبتا شاق و پیچیده ای هست که نیاز به دانش تخصصی داره، ولی ما با کیوت نیازی به انجام دستی اینکار نداریم.
- فرمان سوم برنامهء make رو اجرا میکنه که این برنامه قواعد موجود در Make file پیدا شده رو خونده و بر اساس اطلاعات فایلهای پروژه و فایلهای موجود از کامپایلهای قبلی این قواعد رو اجرا میکنه؛ مثلا قاعده ای میگه اگر فلان فایل جدید بود فلان دستور رو اجرا کن. فرامین نهایی لازم برای کامپایل هرکدام از سورسهای برنامه و اتصال نهایی اونها به همدیگر که برنامهء کامپایلر اصلی (در اینجا ++g) رو فراخوانی میکنن هم جزو این دستورات هستن.