معرفی فریمورک اپلیکیشن نویسی Qt ‏(7)

راستی حتما دقت کردید که ما برای هر جزء از کتابخانهء گرافیکی کیوت که لازم داریم مجبوریم یک دستور include بذاریم. اینکار کمی زحمت داره و ممکنه بارها با پیام خطاهای بعضا عجیب و غیرقابل فهم بعلت فراموش کردن درج دستور اینکلود برای تعریف شیء مورد نظر مواجه بشیم.
برای اینکه بخش بزرگی از این قضیه رو حل کنیم، میتونیم بجای اینکلود کردن تک تک اجزای کتابخانهء اجزای رابط کاربر گرافیکی کیوت، این یک اینکلود رو قرار بدیم که باعث میشه تمام اینکلودها برای تمام اجزای رابطهای گرافیکی انجام بشن:

#include <QtGui>

تنها اشکال بزرگ این دستور اینه که بعلت اینکلود شدن تمام هدرها، که بیشتر اونها مورد نیاز برنامهء ما هم نیستن، پردازش زیادی انجام میشه و این به زمان کامپایل اضافه میکنه؛ ولی اگر سیستم شما اونقدری قوی هست که این زمان افزوده کم و نامحسوس باشه میتونید از این روش برای راحتی کار استفاده کنید.
اما معمولا اینکلود کردن تک تک فایلهای هدر مورد نیاز بنظر حرفه ای تر میاد و ممکنه مزایای دیگری هم با دید وسیعتر و دورنگری بیشتر داشته باشه. روش اینکلود کردن تک تک و فقط اجزایی که برنامه نیاز داره برای حرفه ای تر شدن و شناخت ساختار و ارتباط و طرز کار اجزای رابط گرافیکی، مناسبتر بنظر میرسه.

معرفی فریمورک اپلیکیشن نویسی Qt ‏(6)

یک نکتهء مهم دربارهء پلاگین ها میخوام بگم.
بعضی کارایی ها در کیوت بصورت پلاگین پیاده سازی شدن. این پلاگین ها در پوشه ای بنام plugins در دایرکتوری نصب کیوت قرار دارن. اگر شما نسخه های جدید Qt SDK رو نصب کنید، احتمالا آدرس چنین خواهد بود: Qt installation dir\qt\plugins
منظور از Qt installation dir آدرس دایرکتوری محل نصب کیوت روی سیستم شما هست.

بقیهء مطلب رو با یک مثال نشون میدم که درمورد پلاگین jpg هست، اما بنظرم دقیقا همانطور به بقیهء موارد نیز قابل تعمیم هست. اینکه چه برنامه ای از چه امکاناتی استفاده میکنه و کدام پلاگین ها مورد نیاز هستن و نام فایلهای اونها چیه، کاری هست که برنامه نویس باید انجام بده و بنظرم با بیان این مطلب و این مثال دیگه زیاد سخت نیست.

این کد:

#include <QApplication>
#include <QPixmap>
#include <QPushButton>

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

QPushButton quit("Quit");
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
quit.show();

QPixmap pm(100,100);
pm.save("test.jpg", "jpg");

return app.exec();
}

برنامه ای ایجاد میکنه که بجز یک دکمه که کلیک کردنش باعث خروج از برنامه میشه، یک تصویر خالی با ابعاد 100 در 100 پیکسل ایجاد میکنه و با فرمت jpg اون رو در دایرکتوری جاری ذخیره میکنه. این یک تصویر تماما سیاه خواهد بود و محتویات دیگری نداره، چون ما فقط میخوایم طرز پکیج کردن برنامه هایی رو که با پلاگین های استاندارد کیوت و در اینجا با پلاگین jpg کیوت کار میکنن نشون بدیم.
چون برنامهء ما در فرمت jgp فایل رو ذخیره میکنه، بنابراین ما به پلاگین jpg کیوت نیاز داریم چون امکان کار با این فرمت توسط یک پلاگین در کیوت پیاده سازی شده.
وقتی ما برناممون رو در خط فرمان اجرا میکنیم همه چیز خوب کار میکنه و فایل مورد نظر در دایرکتوری پروژه ایجاد میشه.
اما ما بعد سعی میکنیم برنامه رو به روشی که در پست قبلی گفتم پکیج کنیم تا مستقل از نصب کیوت و روی هر سیستمی اجرا بشه و ضمنا ما هم بتونیم بدون خط فرمان و با کلیک مستقیم روی فایل برنامه اون رو اجرا کنیم.
ما فایلهای QtCore4.dll، QtGui4.dll و mingwm10.dll رو طبق معمول و مطابق درخواست برنامه در اختیارش میذاریم (در دایرکتوری فایل اجرایی برنامه کپی میکنیم). حالا برنامه رو با کلیک کردن روش اجرا میکنیم و میبینیم که ظاهرا همه چیز درست پیش میره.
اما حالا اگر برنامه رو روی سیستم دیگری ببریم که کیوت روش نصب نیست، برنامه با این اشکال مواجه میشه که فایل jpg تولید شده عملا خراب خواهد بود و میبینیم که یک فایل خالی با حجم صفر بایت ایجاد میشه. این به این خاطر هست که برنامهء ما از پلاگین jpg که از دایرکتوری نصب کیوت بدست میاره استفاده میکنه، اما روی سیستم دیگر که کیوت نصب نشده یا احتمالا چون در آدرس دیگری نصب شده، نمیتونه این پلاگین رو پیدا کنه.
ضمنا شما میتونید با Rename کردن موقت دایرکتوری نصب کیوت، این شرایط عدم پیدا شدن پلاگین jpg رو برای تست کردن روی سیستم خودتون شبیه سازی کنید و نهایتا با پکیج کردن تمام فایلهای لازم مطمئن بشید برنامهء شما کاملا مستقل از نصب کیوت روی سیستم کار میکنه. البته یادتون باشه به موقع نام دایرکتوری کیوت رو به نام اولیه برگردونید و همینطور موقع تست حواستون باشه که نام دایرکتوری کیوت در وضعیت استاندارد خودش هست یا در وضعیت تغییر نام یافته و شما کدوم حالت رو برای تست لازم دارید (اشتباه در این زمینه راحت پیش میاد و آدم رو گمراه کرده و باعث هدر رفتن وقت و انرژی و نیاز به تکرار مجدد تست ها میشه).

خب حالا ما چطور باید پلاگین رو در اختیار برناممون بذاریم؟
در دایرکتوری plugins چند دایرکتوری دیگه وجود داره که یکی از اون فولدرها نام imageformats داره و در درونش یکسری پلاگین مربوط به فرمت های تصویر وجود داره که یکی از اونها qjpeg4.dll هست.
ما باید یک فولدر دقیقا با همین نام (imageformats) در فولدر برنامهء خودمون ایجاد کرده و بعد فایل qjpeg4.dll رو هم داخل این فولدر که درست کردیم کپی کنیم.
حالا اگر برنامه رو مجددا تست کنیم (تغییر نام دایرکتوری کیوت فراموش نشه)، میبینیم که فایل jpg تولید شده اینبار درست و غیرخالی خواهد بود.

یک نکته: اگر به فایل qjpeg4.dll خصوصیت پنهان (hidden attribute) داده بشه، برنامهء کیوت اون رو load نکرده و برنامه دوباره درست کار نخواهد کرد.

نکتهء دیگر: موقعی که برنامهء مثال رو اجرا میکنید، محل ذخیرهء فایل تولید شده احتمالا بسته به اینکه از خط فرمان برنامه رو اجرا میکنید یا با کلیک مستقیم، متفاوت خواهد بود. چون معمولا خط فرمان در دایرکتوری پروژه قرار داره، اجرای برنامه از این طریق باعث ایجاد فایل تصویر در دایرکتوری پروژه خواهد شد، اما با کلیک مستقیم روی برنامه، فایل در دایرکتوری خود برنامه که فولدر release در درون فولدر پروژه هست ایجاد میشه.

معرفی فریمورک اپلیکیشن نویسی Qt ‏(5)

در این پست چگونگی پکیج کردن برنامه های کیوت رو بیان میکنم. یعنی وقتی نهایتا برنامتون آماده شده و میخواید بصورت مستقل از اون استفاده کنید.
در این حالت پکیج شده با فایلهای لازم، برنامه قابل انتقال به سیستم های دیگر هم هست و میشه مثلا برای توزیع عمومی اون رو همراه با فایلهای لازم منتشر کرد.
شاید این امر خیلی ناچیز بنظر برسه و تنها مبتدی ترین افراد از پسش برنیان، اما بازهم بیانش لازمه و به سرعت و راحتی کار تازه واردان خیلی کمک میکنه. ضمنا گاهی نکته هایی هست که ندونستنش وقت و انرژی زیادی از افراد میگیره و حتی میتونه باعث ناامیدی بشه. گاهی برنامه پیام خطایی نمیده اما نتیجهء مورد انتظار رو هم از برنامه نمی بینیم.

خب شما برای اینکه برنامه رو آماده و مستقل کنید باید فایلهای لازم رو از فریمورک کیوت دراختیارش بذارید که این فایلها عمدتا یکسری dll هستن.

یک راه بدوی و احتمالا غیراصولی اینه که برای پیدا کردن فایلهای لازم برای برنامه، بسادگی روی فایل اجرایی برنامه دابل کلیک میکنیم و در پیام های خطایی که داده میشه اسم فایلهای لازم رو تشخیص داده و بعد در مکانهای مربوطه (دایرکتوری نصب کیوت و MinGW که در نسخه های اخیر همراه با خود کیوت در دایرکتوری کیوت نصب میشه) اونها رو پیدا کرده و یک کپی از اونها رو کنار فایل اجرایی برنامه قرار میدیم.
مثلا با کلیک بر روی فایل اجرایی برنامهء Hello World (فایل اجرایی برنامهء شما در فولدر release قرار داره) که بعنوان مثال در این تاپیک درج کردیم، اولین پیام خطایی که دریافت میکنیم اینه:

This application has failed to start because mingwm10.dll was not found. Re-installing the application may fix this problem

همونطور که میبینید اولین فایلی که برنامهء ما طلب میکنه mingwm10.dll هست. من این فایل رو براحتی در E:\QT\mingw\bin پیدا کرده و یک کپی از اون رو کنار فایل اجرایی برنامه قرار میدم (من کیوت خودم رو در E:\QT نصب کرده ام اما آدرس مال شما احتمالا فرق داره).
حالا با اقدام به اجرای برنامه، پیام:

This application has failed to start because QtCore4.dll was not found. Re-installing the application may fix this problem

دریافت میشه که میبینیم اینبار فایل QtCore4.dll رو درخواست میکنه.
این فایل رو هم در آدرس E:\QT\qt\bin پیدا و کپی کردم.
بعد یک فایل دیگر مورد نیاز هم QtGui4.dll هست و همونطور که از اسمش مشخصه محتوی اجزای رابط کاربری گرافیکی کیوت هست، به همین ترتیب در E:\QT\qt\bin پیدا و کپی کردم.
حالا برنامهء ما با کلیک کردن روی اون اجرا میشه و کافیه برنامه رو همراه با فایلهایی که به این روش پیدا و کپی کردیم پکیج کنیم. یعنی هرجا فایل اجرایی برنامه میره، فایلهای دی ال ال هم در دسترسش باشن.
راستی وقتی با امکان search ویندوز داخل دایرکتوری نصب کیوت دنبال فایلهای لازم میگردید، اگر دو نسخهء مختلف از فایل مورد نظر پیدا شد، هرکدام که با کپی کردنش برنامتون اجرا شد یا فایل dll بعدی رو درخواست کرد، همون فایل صحیح هست. مثلا کیوت من یکسری فایل مشابه در E:\QT\bin هم داره که برنامم با اونها کار نمیکنه. طبق تحقیقی که در اینباره انجام دادم، دو سری بودن این فایلها ظاهرا به این خاطر هست که یک سری از اونها (اونهایی که در E:\QT\bin هستن) برای اجرای برنامه های خود کیوت هستن و جزو توزیع استاندارد کتابخانهء کیوت نیستن (علت این امر بماند که به بحث ما مربوط نمیشه و مجالش نیست).
یک راه دیگه برای پیدا کردن dll های مورد نیاز، استفاده از برنامه هایی مثل Dependency Walker هست که dll هایی رو که یک برنامه ازشون استفاده میکنه با خیلی جزییات و اطلاعات مربوط دیگه لیست میکنن. برنامهء Dependency Walker رو میتونید از این آدرس بصورت رایگان دانلود کنید (حجمش هم کمه): http://www.dependencywalker.com
دقت کنید هر dll ای که اینطور برنامه ها لیست میکنن رو نباید در کل سیستم سرچ و با برنامه پکیج کرد، چون خیلی از اونها dll های خود ویندوز هستن و در تمام سیستمها وجود دارن و نیازی به همراه بودنشون با برنامه نیست.
تقریبا تمام برنامه های کیوت (نسخهء اپن سورس که با MinGW کامپایل میشه) نیاز به این فایلها دارن:

mingwm10.dll
libgcc_s_dw2-1.dll (این فایل در نسخه های اخیر اضافه شده)
QtCore4.dll
QtGui4.dll

و یک سری برنامه ها تنها به همین فایلها نیاز دارن و کار تمامه، اما اگر برنامهء شما از امکانات دیگری استفاده میکنه باید dll های دیگری رو هم اضافه کنید. یک نمونه از امکانات دیگه مثل کارهای شبکه/اینترنتی هست که نیاز به فایل QtNetwork4.dll داره.
در فهرست بالا تنها درصورتی به فایل QtGui4.dll نیاز نیست که برنامه از اجزای کتابخانهء رابط گرافیکی کیوت و امکانات مربوطه استفاده نکنه.
بنابراین شما میتونید این سه فایل رو همراه تقریبا هر برنامه ای بذارید و دیگه مراحلی رو که گفتم طی نکنید. اما بهرحال اگر برنامهء شما dll دیگری رو طلب کرد یا از امکان خاصی استفاده میکنه (اما ممکنه پیام خطایی هم نده)، باید dll های مربوط دیگر رو هم پیش برنامتون بذارید.

معرفی فریمورک اپلیکیشن نویسی Qt ‏(4)

یک تجربهء شخصی و نکتهء جالب:
اینو بیاد داشته باشید که جلو بودن تاریخ سیستم شما موقع نصب کیوت یا اینکه بعد از نصب کیوت تاریخ سیستم رو عقب ببرید، موجب یک اشکال اساسی برای کامپایل برنامه های کیوت میشه.
فهمیدن علت این مشکل خیلی دشوار بود و وقت و انرژی زیادی از من تلف کرد. باتری مادربورد من تموم شد و تاریخ سیستم عقب رفت، از اون موقع اشکال عجیبی موقع اجرای فرمان mingw32-make بوجود آمد که باعث میشد یک فرمان مدام تکرار بشه و دستور ساخت برنامه هیچوقت تمام نشه!
از اونجایی که سیستم ویروس هم گرفته بود فکر کردم اشکال از ویروس هست و ویندوز رو دوباره نصب کردم، اما بازم اشکال برطرف نشد، چون اینبار موقع نصب کیوت تاریخ سیستم جلوتر از بعد از نصب کیوت بود که تاریخ سیستم رو عقب تر بردم.
نمیدونم بدون سماجت و اطلاع از طرز کار برنامهء make کسی چطور میتونست حدس بزنه که اشکال از کجاست! اینطور اشکالهای بسیار عجیب و غیرقابل حدس هستن؛ مثلا من خودم حتی سخت افزار سیستم مثل RAM و هارد رو هم چک کردم!!

علت این مشکل این بود که موقع صدور فرمان ساخت برنامه های کیوت، یکسری فایلهای پیکربندی دستورات کامپایل که جزو کیوت و در دایرکتوری نصب کیوت هستن چک میشن و اگر تاریخ اونها از تاریخ فایلهای برنامه جدیدتر باشه، دستور خاصی اجرا میشه تا پیکربندی برنامه رو مطابق تنظیمات جدید کیوت آپدیت کنه، اما اگر تاریخ سیستم قدیمی تر از تاریخ فایلهای کیوت باشه حتی با آپدیت شدن هم باز تاریخ فایلهای برنامه قدیمی تر از تاریخ فایلهای کیوت خواهد بود و نتیجتا دستور مجددا و بصورت حلقهء بی پایانی اجرا میشه.
البته اگر بعلتی ناگزیز از عقب بردن تاریخ سیستم پس از نصب کیوت باشیم، میشه راههایی برای خلاص شدن از شر این مشکل پیدا کرد (آپدیت کردن تاریخ فایلهای مربوطه در کیوت یا حذف فرمان مورد نظر از Make File پروژه).

معرفی فریمورک اپلیکیشن نویسی Qt ‏(3)

يه نكتهء كوچك ولي مهم كه فهميدنش از خودم وقت و انرژي زيادي برد:
يادتون باشه تمام كلاسهايي كه از ماكروي Q_OBJECT در تعريف اونها استفاده ميشه، بايد تعريف اونها در يك فايل هدر (با پسوند h) انجام بشه (و نه مثلا در يك فايل با پسوند cpp). چون پيش پردازندهء كيوت كه در اين موارد لازم هست، داخل اين فايلها رو ميخونه و پردازش ميكنه.

—————————-

خیلی وقتها موقع طراحی و برنامه نویسی یک اپلیکیشن نیاز داریم تا از رابط خط فرمان استفاده کنیم. این به علتهای زیادی لازم و مفیده. معمولا خط فرمان راحتترین و سریعترین رابط (از نظر زمان لازم برای برنامه نویسی) برای ورودی و خروجی های ساده هست. به این روش میشه برنامه رو سریعا با ورودیهای مختلفی تست کرد، و البته بیشترین کاربرد در دیباگ کردن یا همون عیب یابی برنامه و اطمینان حاصل کردن از صحت کارکرد برنامه هست. مثلا شما مقادیر متغییرها رو در زمان های مختلف، مثلا در تکرارهای مختلف یک حلقه یا به ازای ورودیهای مختلف تست میکنید و غیره. البته همهء اینها که برای تست هستن در نهایت از برنامه برداشته میشن و یک برنامهء تمیز که احتمالا هیچ ارتباطی با خط فرمان نداره تولید میشه.
درمورد بعضی برنامه ها هم اصولا به رابط خط فرمان نیاز داریم و این برنامه ها اکثرا در خط فرمان مورد استفاده قرار میگیرن و ورودیهایی رو موقع اجرا میگیرن و/یا خروجی و اطلاعاتی رو از کارکرد برنامه بیرون میدن.
خط فرمان هم مزایای خودش رو داره که سرعت و سادگی و امکان استفاده در محیطهای غیرگرافیکی و امکان یکپارچه شدن با بقیهء برنامه ها و فرامین خط فرمان جزو این مزایاست.
ضمنا اینطور برنامه های خط فرمان در فرم نهایی خودشون بعضی وقتها ممکنه یک بخش رابط گرافیکی هم داشته باشن و همزمان در دوحالت خط فرمان و گرافیکی عمل کنن، اما با این حالت خیلی کم مواجه میشیم.
استفاده از خط فرمان در زمان توسعه و عیب یابی برنامه بسیار کاراست و به دقت و سرعت برنامه نویس در تولید برنامه های کارا بسیار کمک میکنه. ممکنه بعضی برنامه نویسانی که فقط با محیطهای ویژاول کار کردن در این زمینه کم اطلاع و ضعیف باشن، بنابراین نمیتونن برنامه های باکیفیت کافی رو با حداکثر سرعت ممکن طراحی کنن. بخصوص بعضی کاربرانی که در عمرشون صرفا با ویندوز کار کردن از قدرت و کارایی خط فرمان اطلاع کافی ندارن (بخصوص که خط فرمان ویندوز مثلا در مقابل خط فرمان گنو/لینوکس، ناقص و بدوی بحساب میاد)، گرچه ظاهرا برنامه نویس باشن. برای همین من جزء به جزء کاربردها و ترفندهای خط فرمانی رو که در برنامه نویسی خیلی مفید و گاه ضروری هستن سعی میکنم روشن کنم.

خب با توجه به اینکه کیوت بطور پیشفرض برنامه هایی که با رابط خط فرمان ارتباط ندارن تولید میکنه، ما چطور میتونیم یک رابط خط فرمان به برنامهء خودمون اضافه کنیم که مثلا فرمانهای خروجی ما رو که با توابع و اشیاء استاندارد سی++ مثل cout صادر میکنیم نشون بده؟
پاسخ اینه که، اینکار به سادگی با اضافه کردن دستور CONFIG+=console به فایل پروژهء برنامهء کیوت ما انجام میشه.

یک نکتهء مهم بخصوص برای کسانی که کمتر از روش خط فرمان برنامه ها رو کامپایل کردن اینکه، اگر برنامه قبل از اینکه ما این دستور رو به فایل پروژه اضافه کرده باشیم کامپایل شده باشه، صرفا با اضافه کردن این دستور به فایل پروژه و اجرای دستور ساخت برنامه (mingw32-make release) عمل خاصی انجام نمیشه. ما باید حداقل یکی از فایلهای پروژه رو تغییری بدیم تا تاریخ ویرایشی جدیدتر از آخرین کامپایل برنامه پیدا کنه و برنامهء make متوجه این تغییر بشه و اقدام به کامپایل مجدد برنامه کنه. برای این منظور ما میتونیم یکی از فایلهای سورس برنامه مثل main.cpp رو باز کرده و بدون اینکه تغییری در اصل کدش بدیم اون رو دوباره save کنیم. (اگر گزینهء سیو ادیتور شما فعال نیست میتونید با اضافه کردن دو کاراکتر اسلش (//) که برای اضافه کردن توضیحات در برنامه های سی و سی++ بکار میرن این گزینه رو فعال کنید، یا صرفا یک کاراکتر تایپ و بعد همون کاراکتر رو پاک کنید).

راستی مزیت دیگر داشتن رابط خط فرمان موقع برنامه نویسی و تست برنامه اینه که وقتی ما برنامهء کامپایل شده رو در خط فرمان فراخوانی میکنیم، تازمانیکه برنامه خاتمه پیدا نکرده خط فرمان برنمیگرده و این کنترل و آگاهی کافی درمورد وضعیت برنامه به ما میده. بخصوص چون اگر یادمون رفته باشه برنامه رو بعد از اجرا و تست خاتمه بدیم و بعد سورس برنامه رو تغییر داده و اقدام به کامپایل مجدد برنامه کنیم، عمل کامپایل نهایتا موفق نمیشه و با یک پیام خطا خاتمه پیدا میکنه (بعلت اینکه کامپایلر نمیتونه فایل اجرایی برنامه ای رو که هنوز خاتمه نیافته جایگزین کنه).
ضمنا از طریق خط فرمان میشه برنامه ها رو براحتی با فشار دادن کلیدهای Ctrl+C خاتمه داد. این کاربرد هم بخصوص زمانیکه برنامه رابط گرافیکی برای خروج نداره بسیار مفیده و در وقت و انرژی برنامه نویس صرفه جویی میکنه، چون در غیراینصورت مجبور میشیم با فشار دادن Ctrl+Alt+Del و بعد در Task Manager ویندوز اینکار رو انجام بدیم تا قادر به کامپایل مجدد برنامه باشیم.

بخاطر اینکه یک مطلب کاربردی دیگه به این پست که بیشترش توضیحات شد اضافه کنم میگم که چطور استفاده از خط فرمان کیوت رو راحتتر و شیرین تر کنید.
خیلی وقتها برای آموزش و تست های برنامه نویسی، یک فولدر درست میکنیم که همیشه فایلهای برنامهء خودمون رو داخل اون ذخیره و کامپایل کنیم. فرضا من در سیستم خودم یک فولدر بنام test روی دسکتاپ ویندوز دارم. من این فرمانها رو:

c:
cd C:\Documents and Settings\hm\Desktop\test

به انتهای فایل E:\QT\bin\qtenv.bat اضافه کردم که باعث میشه وقتی خط فرمان کیوت رو از منوی استارت اجرا میکنم، بطور خودکار در دایرکتوری test من قرار بگیره و بتونم از همون ابتدا به اجرای فرمانهای کیوت روی پروژهء جاری بپردازم.
بجای فرمان c: باید فرمان مربوط به درایو مورد نظر خودتون رو قرار بدید که پوشهء مورد نظر شما در اون قرار داره (همونطور که در آدرس فولدر در خط دوم میبینید، دسکتاپ ویندوز معمولا در درایو c قرار داره چون ویندوز معمولا در درایو c نصب میشه).
آدرس فولدر مورد نظر رو هم که میتونید با باز کردن اون فولدر و کپی کردن آدرس از آدرسبار بدست بیارید و بعد فقط کافیه اولش فرمان cd رو اضافه کنید.
نکتهء بعدی اینکه، در اینجا میبینید که من کیوت رو در درایو E و در پوشه ای با نام QT نصب کردم؛ شما برای پیدا کردن فایل qtenv.bat و اضافه کردن فرمانهای بالا بهش، باید به محل نصب کیوت در سیستم خودتون برید.

معرفی فریمورک اپلیکیشن نویسی Qt ‏(2)

این رو برای برنامه نویسان تازه کار کیوت که با مشکل عدم درج و نمایش صحیح نوشته های فارسی در برنامهء خودشون مواجه میشن میذارم.
برای استفاده از حروف فارسی در برنامهء خودتون این کارها رو باید انجام بدید:

- انکدینگ (Encoding) فایل سورس برنامهء خودتون رو روی UTF-8 قرار بدید.
اینکار بطور مثال در ادیتور برنامه نویسی ++Notepad به اینصورت انجام میشه:

Format -> Encode in UTF-8 without BOM
ناگفته نماند كه ++Notepad يك اديتور برنامه نويسي مجهز (گول اسمش رو نخوريد؛ از نوتپد ويندوز خيلي فاصله داره) و آزاد هست كه روي ويندوز نصب ميشه و بغير Syntax highlighting داشتن براي تعداد زيادي زبان برنامه نويسي و فرمت مانند سي++ و PHP و HTML، از امكانات مفيد ديگري هم برخوردار هست. ضمنا رابط اون از Tab براي سازماندهي همزمان چند فايل استفاده ميكنه.
براي اطلاعات بيشتر و دانلود به اين آدرسها مراجعه كنيد:
http://en.wikipedia.org/wiki/Notepad%2B%2B
http://notepad-plus.sourceforge.net/uk/download.php
فايلي مثل npp.5.4.3.Installer.exe رو بايد دانلود كنيد كه در اينجا 5.4.3 آخرين نسخهء اين برنامه درحال حاضر هست.

خب براي امكان استفادهء مستقيم از حروف فارسي (يا هر زبان ديگري) در برنامه هاي كيوت به شكل زير عمل كنيد.

- اول هدر لازم رو در برنامهء خودتون اضافه كنيد:
#include <QTextCodec>

- این کدها رو:
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

در ابتدای برنامهء خودتون قرار بدید (البته بعد از QApplication).

—————-

حالا مثلا ميتونيد براحتي اين كد رو بنويسيد:

QPushButton hello("!سلام دنيا");

البته دقت کنید که این دستورات روی امکانات و توابع کتابخانهء کیوت کار میکنن و انتظار نداشته باشید روی بخشهای دیگر برنامهء شما که با کدهای استاندارد سی++ و توابع و کتابخانه های غیرکیوت نوشته میشن تاثیری داشته باشن.

معرفی فریمورک اپلیکیشن نویسی Qt ‏(1)

موقعی که شما نسخهء اپن سورس کیوت رو نصب میکنید و 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) رو فراخوانی میکنن هم جزو این دستورات هستن.

معرفی فریمورک اپلیکیشن نویسی Qt – توضیحاتی درمورد دانلود و نصب

خب درحال حاضر شما اگر به http://www.qtsoftware.com/downloads مراجعه کنید و LGPL / Free رو انتخاب کنید میتونید مستقیما پکیج کامل کیوت نسخهء اپن سورس رو دانلود کنید. این پکیج در نسخهء جاری حجمش حدود 167 مگابایت هست و برای دانلودش باید اینترنت پرسرعت داشته باشید یا بهرصورت دیگه ای مثل سفارش دانلود اون رو دریافت کنید. من با اینترنت 256 کیلوبیت بر ثانیه در شرکت محل کارم فکر میکنم ظرف حدود 3 ساعت دانلودش کردم.
درمیان گزینه ها گزینهء Download Qt SDK for Windows رو انتخاب کنید که مجموعه کامل ابزارهای برنامه نویسی کیوت برای محیط ویندوز هست. شامل: کتابخانه های کیوت (فایلهای دی ال ال)، Qt Creator IDE (محیط گرافیکی با ابزارهای مجتمع شده)، و ابزارهای خط فرمان کیوت (برای ساخت برنامه ها، آپدیت زبان برنامه ها و غیره).

توجه داشته باشید که اگر شما لینوکس دارید و لینوکس شما محیط دسکتاپ کی دی ای داره، میتونید براحتی از کیوت استفاده کنید و معمولا بخصوص اگر نسخهء لینوکس شما جدید باشه نیاز به دانلود کیوت ندارید. چون یا محیط برنامه نویسی کیوت از پیش در لینوکس شما نصب هست یا میتونید اون رو داخل سی دی لینوکس خودتون پیدا و نصب کنید.
ما در اینجا فعلا به محیط ویندوز میپردازیم که از نظر کیوت چندان فرقی با محیط لینوکس نداره اما بهرحال تفاوتهایی هست. من آخرین نسخهء کیوت رو به علتی روی ویندوز نصب کردم و یادگیری و برنامه نویسی رو روی ویندوز انجام دادم در اینجا هرچی میگم مربوط به همین فعالیت ها میشه. ضمنا آموزش در ارتباط با نسخهء ویندوزی برای جامعهء ما خیلی مفیدتر و عملی تر هست و این افراد بعدا میتونن لینوکس رو هم امتحان کنن.

این نسخهء اپن سورس ویندوزی از کیوت که شما دانلود میکنید از MinGW برای کامپایل برنامه ها استفاده میکنه که این MinGW یک مجموعه از ابزارها و کامپایلرهای لازم برای اینکار هست و یک پروژهء مستقل از کیوت که افراد دیگری اون رو ایجاد کردن که این ابزارها و برنامه ها در اصل به محیط لینوکس تعلق دارن اما مثل کیوت نسخهء ویندوزی اونها هم ساخته شده. البته اینکه میگیم این ابزارها و کیوت در اصل و اول روی محیط لینوکس بودن نباید لزوما به این معنا تلقی بشه که این ابزارها برای محیط ویندوز کارا و مناسب نیستن و باهاش هماهنگی ندارن. این ابزارها در یک حداقل کاملا قابل استفاده هستن، اگر بهتر از این و حتی گاهی بهتر از ابزارهای بومی ویندوز نباشن.
ضمنا مزیت اینکه از کیوت و اینطور برنامه ها و ابزارهای آزاد استفاده میکنید اینه که اولا کاملا آزاد و قانونی هستن و محدودیتی روشون نیست و در هرنقطه ای از جهان با هر قانونی تغییری در امکان استفادهء شما بوجود نمیاد، و دوما شما به تنها یک سیستم عامل وابسته نیستید، و سوما به یک شرکت انحصارگر با سیاستهای تجاری صرف هم وابسته نیستید و مجبور نیستید در همه چیز از یک مرجع اینچنین پیروی کنید! راستی مجانی بودن کیوت رو هم میشه مزیت بزرگی دونست، گرچه در کشور ما فعلا بعلت عدم اعمال قوانین کپی رایت و انحصارهای فکری بخصوص کشورهای دیگر، برای ما عملا تفاوتی نمیکنه؛ ولی حداقلش اینه که شما نیازی به استفاده از ابزارها و برنامه های پردردسر کرک شده ندارید و لازم نیست تا همیشه منتظر کرک شدن نسخه های جدید چنین برنامه هایی و گیرآوردن اونها باشید. چه دیدید شاید هم یه زمانی فناوریهای حفاظتی و انحصار پیشرفت کرد و دیگه نتونستن چنین برنامه هایی رو کرک کنن!!

حالا که کیوت رو دانلود کردید نصب اون با استفاده از برنامهء نصب دانلود شده، مثل برنامه های معمولی ویندوز کار راحتی هست و نیاز به توضیح خاصی نداره.
بعد از نصب این نسخهء کیوت (2009.02 / Qt 4.5)، در منوی استارت شما تحت منوی Qt SDK by Nokia v2009.02 گزینه هایی اضافه میشن که اصل کاری های اونها رو شرح میدم:

Qt Command Prompt: محیط خط فرمان رو برای کیوت آماده و اجرا میکنه که ما صرفا برای ساخت و کامپایل برنامه ها باهاش سروکار داریم و چند فرمان خاص رو برای ساخت پروژه ها و کامپایل برنامه ها مدام درش اجرا میکنیم (ضرورتی برای تسلط بر داس یا خط فرمان ویندوز نیست).

Qt Creator: محیط طراحی و برنامه نویسی گرافیکی و مجتمع شدهء جدید کیوت که در اون میتونید رابط برنامه ها رو بصورت ویژوال طراحی کنید، کد بنویسید، دیباگ کنید (بخش دیباگر گرافیکی هم داره)، از Help / Reference کیوت استفاده کنید و غیره.
نکته اینکه Qt Creator جدید هست و در نسخهء قبلی کیوت نبود و بجاش تنها برنامهء طراحی ویژوال رابط کاربری ای بنام Qt Designer وجود داشت که الان این برنامه زیرمجموعهء محیط کاملتر Qt Creator شده و در درون اون قرار گرفته.
چون من با نسخهء قبلی کیوت و بنابراین فقط با Qt Designer کار کردم اگر توضیحی درمورد ابزارهای برنامه نویسی ویژاول کیوت بخوام بدم فقط درمورد Qt Designer خواهد بود.

Qt Linguist: ابزار گرافیکی ای برای تغییر زبان و تولید ترجمه های مختلف برای متونی که در برنامهء شما بکار رفتن هست.
توضیح اینکه من با این برنامه کار نکردم و اولویتی هم بهش نمیدم و بنابراین مطلبی راجع بهش نمیذارم. تازه اگر برسیم و بتونیم راجع به ابزارهای گرافیکی کیوت مطلبی بذاریم. البته درمورد تغییر زبان و استفاده از ترجمه های متن در برنامه های کیوت و کدنویسی احتمالا صحبت خواهیم کرد.
بازم روشن کنم که این تاپیک یک آموزش کامل و کلی نیست و فقط نکات خاص و عمومی برای آشنایی و دید کافی و کمک به راه اندازی اولیه هست. برای آموزش کامل کیوت به زبان فارسی باید کل رفرنس رسمی اون رو ترجمه کرد. البته در این تاپیک کسی اگر سوال خاصی هم داشت میتونه مطرح کنه که اگر تونستیم و وقت شد پاسخ داده بشه.

معرفی فریمورک اپلیکیشن نویسی Qt – توضیحات بیشتر

بهتر دیدم ابتدا از مقالهء ویکیپدیا دربارهء کیوت شروع کنم و بخشهایی از این مقاله بعلاوهء مقداری اطلاعات شخصی خودم رو نقل کنم.

از جمله نرم افزارهای معروفی که در اونها از کیوت استفاده شده KDE (یکی از دو محیط دسکتاپ اصلی برای توزیعهای مختلف گنو/لینوکس که خودش شامل نرم افزارهای مهم متعددی هم میشه)، مرورگر وب اپرا، Google Earth، Skype، Adobe Photoshop Album، VirtualBox، و OPIE هستن.
مسلما تعداد نامحدودی اپلیکیشنهای پراکنده و شخصی هم تاکنون با کیوت نوشته شدن و استفاده از این فریمورک بعد از ابزارهای پلتفرم ویندوز (بعلت غلبهء بازاری مایکروسافت)، خیلی فراگیر هست. ضمنا کیوت یکی از مهمترین و معروف ترین ها درمیان معدود کتابخانه ها و فریمورک های قدرتمند و کامل آزادی که وجود دارن هست.
البته در دنیای نرم افزار آزاد تنوع و تکثر معمولا زیاد و گاهی گیج کننده هست (که این اثر طبیعی آزادی و تعدد تولیدکنندگان هست) اما تنها چند کتابخانهء معدود در سطح اول رقابت هستن که اینقدر کامل، قوی و مستقل از پلتفرم هم باشن (یکی دیگه که خیلی معروفه GTK نامیده میشه).

کیوت تا June 17, 2008 که شرکت تولید کنندش توسط کمپانی نوکیا خریداری شد به یک کمپانی نروژی بنام Trolltech تعلق داشت، و الان با وارد کردن نام سایت شرکت Trolltech بصورت trolltech.com به بخش مربوط به کیوت شرکت نوکیا (Qt Software) با آدرس qtsoftware.com هدایت میشیم.

کیوت از زبان سی++ به اضافهء چندین توسعهء غیراستاندارد استفاده میکنه (نترسید! این توسعه ها مشکلی در برنامه نویسی پیش نمیارن و برای راحت کردن کارها ایجاد شدن). این توسعه ها و امکانات بوسیلهء یک پیش پردازندهء سی++ که نهایتا قبل از کامپایل نهایی، کدهای خالص سی++ استاندارد رو تولید میکنه پیاده سازی شدن.

شما برنامه هاتون رو با کیوت به زبان سی++ مینویسید، اما عملا خیلی کم نیاز به استفادهء مستقیم از کتابخانه ها و توابع استاندارد خود سی++ دارید و فریمورک وسیع کیوت رنج وسیعی از کلاسها و توابع لازم برای اپلیکیشن نویسی رو دراختیار شما قرار میده و کار کردن باهاش هم به نحو چشمگیری راحتتر و سریعتر و کم حجمتر و ضمنا امن تر (از نظر خطاهای منطقی برنامه نویسی) از توابع سطح پایینتر سی++ هست. خب البته این کاری هست که فریمورک ها و کتابخانه های سطح بالاتر معمولا کم و بیش انجام میدن و یکی از اهداف و تعاریف اونهاست، اما کیوت یک فریمورک اپلیکیشن نویسی با امکانات کامل GUI (رابط گرافیکی برای کاربر برنامه) هم هست ضمن اینکه امکان برنامه نویسیهای دیگر مثل سرور و خط فرمان رو هم همینطور فراهم کرده و ارتقا میده.

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

امکانات مفید دیگری که کیوت داره و جزو لازم برای یک کتابخانهء رابط گرافیکی نیستن شامل کتابخانهء دسترسی و کار با دیتابیس های مختلف مثل MySQL و SQLITE و ODBC، کار با XML، کار و مدیریت thread ها (اصطلاحا برنامه های چندریسمانی یا چندنخی)، کتابخانهء شبکه برای کار با شبکه و اینترنت، و یک رابط یکپارچه مستقل از پلتفرم برای کار با فایلها هستن.
همه اینها خیلی مفید و کارا هستن و مثلا برنامهء شما میتونه سریعا تبدیل به یک برنامه ای که با دیتابیس خودش یا دیتابیسی روی سیستم کار میکنه بشه.
کتابخانهء مربوط به thread هم کمبود کتابخانهء استاندارد thread رو در سی++ بطور کامل برطرف میکنه و کار کردن باهاش هم خیلی راحته. با برنامه نویسی چند ریسمانی ما میتونیم برنامه هایی بنویسیم که ویژگیهای مفید و جالبی دارن مثل پردازش موازی و استفادهء بهینه تر از منابع سیستم و وقت و انرژی کاربر و همچنین جاهایی که نیاز داریم برای داشتن یک برنامهء خوب اون رو بصورت چند ریسمانی پیاده کنیم.

از نظر لایسنس یا مجوز قانونی، کیوت تحت چند مجوز منجمله GNU LGPL ارایه میشه که این مجوز یک مجوز رسمی و معروف نرم افزار آزاد هست و این امکان رو هم میده که برنامه هایی داشته باشیم که لزوما همهء بخشهای اونها آزاد نیست و مجبور نیستیم سورس کدهای خودمون رو همراه برنامه و تحت مجوز آزاد دراختیار دریافت کنندگان برنامه قرار بدیم. البته اصولا چنین قابلیتی برای کسانی که به فلسفهء نرم افزار آزاد علاقه و اعتقاد دارن چندان جذاب نیست یا بی ارزش و حتی در مواردی مضر تلقی میشه، ولی بهرحال خیلی افراد هم کم و بیش طور دیگری فکر میکنن و چنین امکانی رو میخوان.
اگر بیش از این بخوایم امکان انحصاری کردن برنامه رو داشته باشیم و حتی LGPL هم شرایط مورد نظر رو به ما نده، میتونیم کیوت رو با لایسنس انحصاری که باید بابت بدست آوردنش هزینهء لازم رو بپردازیم خریداری کنیم. م: تاجایی که میدونم نسخهء انحصاری کیوت یکی دو مورد امکانات خاصی رو هم بیشتر از نسخهء آزاد داره که البته نبودن اونها در نسخهء آزاد چندان مهم و مشکل ساز بنظر نمیرسن و اونها تنها یکی دو مورد اجزای ویژه ای مثلا مربوط و مختص به سیستم عامل ویندوز هستن (مثل اکتیوایکس) که ارتباط مستقیمی هم با بخشهای اصلی مثل رابط گرافیکی ما ندارن و اونها رو ناقص نمیکنن؛ ضمنا اگر نیاز ضروری در برنامهء خودتون داشته باشید و بخواید از کتابخانه های آزاد یا مجانی استفاده کنید بنظرم میتونید از کتابخانه های دیگر در این زمینه یا کتابخانه های خود میکروسافت برای چنین امکاناتی در کنار کیوت استفاده کنید.

م: راستی از اینکه ممکنه کیوت زمانی انحصاری بشه هم زیاد نگران نباشید چون وجود KDE که جزو عمده و مهمی از گنو/لینوکس و دنیای نرم افزار آزاد هست پشتوانهء خوبی برای اون بحساب میاد. سالهاست که کیوت یکی از اجزای اصلی پروژه های بزرگی در نرم افزار آزاد بوده و به مرور حتی آزادتر و سازگارتر با مجوزهای رسمی نرم افزار آزاد هم شده، در کنار اینکه از نظر فنی هم واقعا رشد کرده.

مورد دیگه که شخصا میخوام بگم این هست که کیوت دارای برنامه و محیط ویژوال برای طراحی رابط کاربری هم هست و این مژدهء خوبی برای برنامه نویسانی که عادت و علاقه ای به کد نوشتن دستی ندارن و احتمالا تنها یا عمدهء موارد برنامه هاشون رو با ابزارهای ویژوال محیط ویندوز و مایکروسافت کار کردن هست. البته من چون اصولا با محیطهای ویژوال دیگر کار نکردم و کلا هم 99.9% موارد کد نویسی دستی میکنم متاسفانه نمیتونم میزان امکانات و شباهت طراحی ویژوال کیوت رو با مثلا ویژوال استودیوی میکروسافت مقایسه کنم.
علاقه به کد نوشتن دستی و آگاهی و کنترل کامل نسبت به تک تک اجزا و کدهای برنامه و احساس عدم نیاز به محیطهای ویژوال ویژگی ای هست که درمیان خیلی از برنامه نویسان نرم افزار آزاد وجود داره و مسلما دلایل منطقی ای هم داره.
بنظر من یک برنامه نویس واقعی باید اول کدنویسی دستی رو بطور کامل و با تسلط کافی بلد باشه و بعد تنها برای صرفه جویی در وقت و انرژی از محیطهای ویژوال درجایی که کفایت میکنه و واقعا تاثیر مثبت چشمگیری در این زمینه ها داره استفاده کنه، وگرنه برنامه نویسی که نتونه دوتا کد درست برای رابط گرافیکی بنویسه اصولا برنامه نویس بحساب نمیاد و نمیتونه بخشهای اصلی دیگر برنامه و کدهای عملیات داخلی رو که نیاز به کدنویسی دستی دارن بقدر کافی خوب طراحی کنه. از طرف دیگه طبق تجربه و مطالعه ای که شخصا با ابزار ویژوال کیوت داشتم (همچنین در زمینهء طراحی و برنامه نویسی وب با فرانت پیج میکروسافت) و اون رو با کدنویسی دستی مقایسه کردم، اولا قدرت و امکانات با کدنویسی دستی به نحو چشمگیری بیشتر هست و اصولا نمیشه با محیط ویژوال هرکاری رو انجام داد و خیلی کارها با کدنویسی دستی بهتر و قویتر و کاملتر ایجاد میشن و دوما بنظرم اگر برنامهء ما کمی پیشرفته و گسترده باشه و کدنویسی داخلی قابل توجهی داشته باشه، وقت و انرژی اضافه ای که صرف مطالعه و تطبیق و ترکیب کدهای ایجاد شده بصورت خودکار با کدهای خودمون میشه مزیت استفاده از محیط ویژوال رو زیر سوال میبره. مزیت دیگر کدنویسی دستی، آپدیت و مستقل بودن همیشگی برنامه نویس هست و چنین برنامه نویسی به حداقل امکانات برای انجام کار خودش نیاز داره و میتونه روی هرکدی از هرجایی هم کار کنه. البته از مزایای طراحی رابط کاربر با محیط ویژوال هم میشه عمدتا به صرفه جویی در وقت و انرژی اشاره کرد که مسلما وقتی زیاد باشه مهم هست و خب این بخصوص در کارهای تجاری و بازار کار ممکنه خیلی مهمتر بشه. یکی از خواص محیط ویژوال که میتونه باعث تفاوت چشمگیر در زمان صرف شده بشه، اینه که نیاز نیست برنامه برای دیدن و تست و تغییر ظاهرش بارها کامپایل بشه (این کامپایل و اجرا کردن به کرات، در مجموع زمان قابل توجهی میبره بخصوص که بخوایم جزییات ظاهری کوچک و متعددی رو مدام تست کنیم و تغییر بدیم).
این توضیحات رو برای این دادم که اگر محیط کیوت به اندازهء ویژوال استودیو با زبانهای میکروسافتی براتون جذاب نبود بدونید که لزوما هر زبان و ابزار و کتابخانه برای همه نوع و همه سطحی از برنامه نویسی و برنامه نویسان نیست.
انشاا… سعی میکنیم در این تاپیک مقداری به چگونگی استفاده از رابطهای گرافیکی تولید شده با محیط ویژاول کیوت هم بپردازیم. منتها متاسفانه بعلت کمبود وقت و انرژی و امکانات، امکان آموزش تصویری و حتی درج تصاویری مقدماتی از بخشهای مختلف کیوت وجود نداره (مگر اینکه یکی دو مورد رو تصادفا بذاریم) و برای دیدن تصویر در زمینه های مختلف بهتره در گوگل جستجو کنید و ضمنا در مستندات خود کیوت هم توضیحات و تصاویری وجود دارن (نمونه برنامه های کیوت و مثالها و دموها هم به همین ترتیب).
ما در اینجا مسلما قصد داریم کدهایی از برنامه نویسی رو هم بعنوان نمونه ارایه کنیم تا بتونید آشنا بشید و مقایسه ای با زبانها و فریمورک های دیگه انجام بدید.

==========================

منبع بخشهای مربوط به ویکی پدیا: http://en.wikipedia.org/wiki/Qt_toolkit

معرفی فریمورک اپلیکیشن نویسی Qt (مقدمه)

در اینجا میخوایم به یاری خدا از فریمورکی قدرتمند و Cross platform برای اپلیکیشن نویسی دسکتاپ و ایجاد GUI که Qt (تلفظ میشه کیوت) نامیده میشه صحبت کنیم. البته این فریمورک اونقدری وسیع و کارا و راحت هست که ازش در کاربردهای متعددی غیر از اپلیکیشن دسکتاپ هم میشه استفاده کرد. طراحی برنامه های با رابط و کارایی کامندلاین و برنامه های سرویس دهندهء خاص هم با این فریمورک عملی و معمول و خوشایند هست.

این فریمورک (Framework) دارای کتابخانهء وسیع و قدرتمند خوب و راحت طراحی شده با زبان سی++ هست و داکیومنت و کامیونیتی (جامعهء برنامه نویسان و علاقمندان و حامیان در اینترنت) خوبی هم داره.

باید گفت که فریمورک کیوت باعث افزایش چشمگیر در بکارگیری راحت و سریع زبان سی++ هم شده و نام و قدرت و سختی معروف چنین زبانهایی نباید ما رو به هراس بیاندازد. در عین حال ما از زبانی همه جایی، آزاد و با قدرت و سرعت مطلوب استفاده میکنیم.

با این فریمورک میشه روی سیستم عامل ها و پلتفرم های سخت افزاری متعدی برنامه نویسی کرد (خصوصیت Cross platform) و بقول معروف یک کد رو روی چند سیستم عامل کامپایل و اجرا کرد. اغلب به تغییرات در کد یا نیازی نیست یا تغییرات بسیار محدود هستن. حتی درصورت استفاده از امکانات این پلتفرم در این زمینه، فایلهای دیتای شما هم میتونن با این فریمورک مستقل از سیستم عامل و سخت افزار باشن و از سیستم عامل و سخت افزاری به سیستم عامل و سخت افزار دیگر انتقال داده بشن و احتیاج به تطبیق و تبدیلهای خاصی که بعضا پیش میان نداشته باشن.

سیستم عاملهای اصلی که این فریمورک پشتیبانی میکنه شامل ویندوز و ویندوز CE، یونیکس/گنو-لینوکس و Embedded Linux، و Mac OS X و همچنین تقریبا اخیرا پلتفرم دیگری برای گوشی های موبایل هست (ظاهرا S60 که متعلق به نوکیا هست).

هدف ما در اینجا معرفی و آشنایی مقدماتی، کمک به شناسایی و راه اندازی، و پیشرفت سریعتر در یادگیری و بکارگیری این فریمورک و کتابخانهء وسیع هست.
اگر دوستان دیگر هم آشنایی و تجربه ای با این پلتفرم دارن میتونن نظرات و مطالب خودشون رو آزادانه در این تاپیک مطرح کنن. خیلی خوشحال میشم این بحث یک طرفه نباشه و ضمنا از طرفهای دیگر هم فیدبک بگیرم و نظرات دیگران رو بدونم.
البته در اینجا فعلا قصد ندارم بحث مستقیم و با جزییات از خود برنامه نویسی بکنم. با توجه به محدودیت وقت و انرژی و اولویتی که میتونم به این قضیه بدم، هدف فعلا صرفا معرفی و صحبت درمورد مزایا و ارایهء چند نکتهء کاربردی مفید برای مبتدی ها هست که یادگرفتن پیشاپیش اونها به مبتدی ها کمک میکنه استارت سریع و موفقی داشته باشن و مشکلاتی رو حل میکنن و نیازهایی رو پاسخ میدن که خودم در جریان یادگیری و استفاده باهاشون برخورد کردم.

البته باید بگم که چون بنده تازگی یادگیری این فریمورک رو بعنوان اولین تجربهء عملی خودم در زبان سی++ و اپلیکیشن نویسی دسکتاپ و با رابط گرافیکی انجام دادم و تنها رفرنس و خودآموز همراه خود این فریمورک رو خوندم، بنابراین ادعای آگاهی و تجربه و تسلط کامل و حرفه ای رو در این زمینه ندارم. بغیر از رفرنس و خودآموزی که همراه این فریمورک نصب میشه، کتابهای معروف و یا رسمی ای هم در این زمینه وجود دارن که بنده حداقل تاحالا مطالعه نکردم، ولی بهرحال رفرنس رسمی تمام کلاسها و امکانات این کتابخانه و فریمورک رو خوندم و تقریبا هرچه داکیومنت همراهش نصب شد مطالعه کردم؛ شامل مثالها و خودآموز و تعدادی تمرین. خیلی از کارایی های این فریمورک رو هم تست کردم که بخوبی و بدون باگ و با سازگاری، قدرت، سرعت، و راحتی مطلوبی کار میکنن.

از آنجایی که ملت عزیز ما اکثرا مایکروسافتی هستن و اکثرا تنها با محیطها و برنامه ها و ابزارهای برنامه نویسی مایکروسافت و محصولات انحصاری آشنایی و انس دارن و بازار کار ما هم تحت تاثیر همین پارامترها هست بنده فکر میکنم حتی اطلاعات مقدماتی و نام و مشخصاتی هم از اینطور محیطها و ابزارها، بقدر کافی نزد عموم و مبتدی ها و حتی خیلی از متخصصان ما وجود ندارد.
درحالیکه ما میتونیم از ابزارهایی آزاد و قدرتمند که وابسته به پلتفرم و در کنترل انحصاری و تحت سیاست تجاری محدود کننده ای هم نیستن براحتی بهره ببریم و از بعد برنامه نویسی هم از وجود اونها استفادهء کامل برده و لذت برنامه نویسی واقعی رو تجربه کنیم.