PDA

View Full Version : معرفی فریمورک اپلیکیشن نویسی آزاد و مستقل از پلتفرم Qt



eshpilen
شنبه 01 خرداد 1389, 00:17 صبح
توضیح: این تاپیک کپی تاپیک مشابه بنده در چند فروم دیگر هست. اگر آیدی استارتر چیز دیگری بود فکر نکنید رفتم مطلب آموزشی دیگران رو بنام خودم کپی کردم! Folaani خودم هستم.

دو نکته رو بگم. اول اینکه روش درست نوشتن این هست: Qt و نه QT
دوما تلفظ میشه کیوت نه کیوتی.

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

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

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

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

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

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

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

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

eshpilen
شنبه 01 خرداد 1389, 00:21 صبح
... (توضیح: پستهای میانی فاصله اندازه بخاطر کم شدن حجم صفحات تاپیک بخاطر حجم زیاد متن پستها هست که بصورت تجربی مفید دیدم).

eshpilen
شنبه 01 خرداد 1389, 00:21 صبح
بهتر دیدم ابتدا از مقالهء ویکیپدیا دربارهء کیوت شروع کنم و بخشهایی از این مقاله بعلاوهء مقداری اطلاعات شخصی خودم رو نقل کنم.

از جمله نرم افزارهای معروفی که در اونها از کیوت استفاده شده 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

eshpilen
شنبه 01 خرداد 1389, 00:23 صبح
..........

eshpilen
شنبه 01 خرداد 1389, 00:23 صبح
خب درحال حاضر شما اگر به 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: ابزار گرافیکی ای برای تغییر زبان و تولید ترجمه های مختلف برای متونی که در برنامهء شما بکار رفتن هست.
توضیح اینکه من با این برنامه کار نکردم و اولویتی هم بهش نمیدم و بنابراین مطلبی راجع بهش نمیذارم. تازه اگر برسیم و بتونیم راجع به ابزارهای گرافیکی کیوت مطلبی بذاریم. البته درمورد تغییر زبان و استفاده از ترجمه های متن در برنامه های کیوت و کدنویسی احتمالا صحبت خواهیم کرد.
بازم روشن کنم که این تاپیک یک آموزش کامل و کلی نیست و فقط نکات خاص و عمومی برای آشنایی و دید کافی و کمک به راه اندازی اولیه هست. برای آموزش کامل کیوت به زبان فارسی باید کل رفرنس رسمی اون رو ترجمه کرد. البته در این تاپیک کسی اگر سوال خاصی هم داشت میتونه مطرح کنه که اگر تونستیم و وقت شد پاسخ داده بشه.

eshpilen
شنبه 01 خرداد 1389, 00:24 صبح
...........

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

eshpilen
شنبه 01 خرداد 1389, 00:26 صبح
............

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

- انکدینگ (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::codecF orName("UTF-8"));

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

----------------

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


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

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

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

eshpilen
شنبه 01 خرداد 1389, 00:28 صبح
...............

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

خب با توجه به اینکه کیوت بطور پیشفرض برنامه هایی که با رابط خط فرمان ارتباط ندارن تولید میکنه، ما چطور میتونیم یک رابط خط فرمان به برنامهء خودمون اضافه کنیم که مثلا فرمانهای خروجی ما رو که با توابع و اشیاء استاندارد سی++ مثل 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 و اضافه کردن فرمانهای بالا بهش، باید به محل نصب کیوت در سیستم خودتون برید.

eshpilen
شنبه 01 خرداد 1389, 00:29 صبح
..........

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

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

eshpilen
شنبه 01 خرداد 1389, 00:31 صبح
...........

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

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

eshpilen
شنبه 01 خرداد 1389, 00:33 صبح
................

eshpilen
شنبه 01 خرداد 1389, 00:34 صبح
یک نکتهء مهم دربارهء پلاگین ها میخوام بگم.
بعضی کارایی ها در کیوت بصورت پلاگین پیاده سازی شدن. این پلاگین ها در پوشه ای بنام 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 در درون فولدر پروژه هست ایجاد میشه.

eshpilen
شنبه 01 خرداد 1389, 00:34 صبح
..................

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


#include <QtGui>

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

eshpilen
شنبه 01 خرداد 1389, 00:36 صبح
..........

eshpilen
شنبه 01 خرداد 1389, 00:36 صبح
ما تابع qDebug رو در کیوت برای فرستادن پیامهای خروجی که معمولا موقع برنامه نویسی و تست برنامه لازم داریم استفاده میکنیم. این پیامها ممکنه بعد از تکمیل و تست برنامه از برنامه برداشته بشن، و البته شاید گاهی هم نه و این پیامها جزیی از پیامهای خطای دایمی برنامه باشن.
بهرحال ما این تابع رو تقریبا بصورت تابع printf در زبان C بکار میبریم. مثلا:


qDebug("variable abc has a zero value");
qDebug("v1=%d, v2=%d", v1, v2);

ما یک فرم دیگه رو هم از این تابع میتونیم بکار ببریم که گاه راحتتره و شبیه cout در زبان C++ عمل میکنه.
اما برای اینکه بتونیم از این شکل هم در برنامه هامون استفاده کنیم باید فایل header خاصی رو به برنامه اضافه کنیم:


#include <QtDebug>

حالا میتونیم مثلا اینطور بنویسم:


qDebug()<<"condition 1"<<v1<<v2;

دقت کنید که پرانتزها ضروری هستن.
در این فرم از بیشتر انواع دادهء هم سی++ و هم کیوت میشه استفاده کرد.

خب تا اینجا دیدیم که چطور میشه پیامهایی رو به خروجی فرستاد. کاری که ظاهرا میشه توسط printf و cout هم که آشنای برنامه نویسان سی و سی++ هستن انجام داد. البته مشخصا یک مزیت استفاده از qDebug این هست که نیازی به درج اینکلود هدر سی و سی++ نداریم و یک مزیت دیگر هم اینکه با انواع داده ای خاص کیوت میشه راحتتر کار کرد و نیاز به تبدیل ندارن؛ چیزی که ممکنه درمورد توابع printf و cout نیاز بشه (مثلا احتمالا درمورد رشته های کیوت که از نوع یونیکد هستن).

مسلمه که ما فقط موقعی میتونیم از خروجی متنی در برناممون کمک بگیریم که برنامهء ما یک رابط خط فرمان داشته باشه؛ یعنی ما دستور CONFIG+=console رو به فایل پروژه اضافه کرده باشیم.
البته درصورتیکه برنامه در یک محیط IDE که امکانات دیباگ داره بکار بره، این خروجی مستقیما به دیباگر ارسال میشه و بنظرم دیگه نیازی به داشتن خط فرمان ندشته باشیم (تست نکردم، ولی در مستندات ظاهرا اینطور نوشته).

حالا ممکنه مثلا گاهی ما بخوایم خط فرمان نداشته باشیم یا اینکه اصولا این دستورات خروجی (توسط qDebug) در برنامه باقی بمونن و جزیی از پیامهای خطای برنامه باشن که میخوایم موقعی که برنامه رابط خط فرمان هم نداره، اطلاع داده بشن.
به این منظور میتونیم اینطور عمل کنیم:


#include <QErrorMessage>

و بعد در اوایل بدنهء برنامه:


QErrorMessage::qtHandler ();

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

راستی از QErrorMessage میشه بصورت مستقل و بدون اینکه مجبور باشیم اون رو بعنوان نمایش دهندهء پیامهای qDebug تنظیم کنیم هم استفاده کرد. مثلا به اینصورت:


QErrorMessage errOut;
errOut.showMessage("application's config file is missing!");

eshpilen
شنبه 01 خرداد 1389, 00:37 صبح
.................

eshpilen
شنبه 01 خرداد 1389, 00:39 صبح
توضیح: این پست تاریخچه ای هست و دیگه مسئلهء ذکر شده در این پست در کیوت وجود نداره (در نسخه های اخیر Phonon بدون مشکل بصورت پیشفرض فعال هست و کار میکنه).

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

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

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

مسئله ای که این قضیه رو بیشتر مایهء تاسف میکنه اینه که این امکان در نسخه های دیگر کیوت، منجمله نسخه های اپن سورسی که با کامپایلر Visual C++ میکروسافت کامپایل بشن وجود داره. البته بازهم من هنوز گزینهء کامپایل با ویژوال سی++ رو آزمایش نکردم، ولی میگن مشکل فقط با mingw هست. سعی من در این هست که این قابلیت با mingw امکان پذیر بشه چون ابزارهایی مثل mingw و کامپایلرهای آزاد معروفش نزد برنامه نویسان خبره و نرم افزار آزاد خیلی متداول و محبوب هستن (البته در گنو/لینوکس بیشتر) و ضمنا با mingw نیاز و وابستگی ای نسبت به ابزارهای صرفا میکروسافتی و انحصاری نخواهیم داشت و بیشتر هم مستقل از پلتفرم خواهیم بود.
بهرحال اگر با mingw موفق نشدم، احتمالا گزینهء ویژوال سی++ رو هم خواهم آزمود و اگر موفق شدم، روش افزودن phonon به کیوت نسخهء اپن سورس با ویژوال سی++ رو آموزش خواهم داد که باعث میشه دیگه کمبود و شکایتی در این زمینه نباشه (مگر از جانب افراد گیری مثل من که خیلی علاقمند به نرم افزار آزاد باشن).

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

البته پخش صوت به شکل ساده برای بخشهای رابط کاربری، قابلیت مورد انتظاری در یک فریمورک اپلیکیشن نویسی و GUI هست، بنابراین حتی بدون phonon هم امکان پخش اینطور صوتها در کیوت بطور خیلی راحتی وجود داره که بعدا بهش اشاره خواهم کرد.

eshpilen
شنبه 01 خرداد 1389, 00:40 صبح
................

eshpilen
شنبه 01 خرداد 1389, 00:41 صبح
توضیح: این پست تاریخچه ای هست (به توضیح پست قبلی مراجعه شود)

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

مدتیست هر روز به هر دری زدم، با مسئولان رسمی خود کیوت مکاتبه کردم، توی اینترنت سرچ کردم، مدت زیادی توی یک فروم انگلیسی زبان داشتم سر و کله میزدم، حداقل بیش از ده بار کیوت رو روی سیستم نصب و کامپایل مجدد کردم. هر کامپایل حداقل حدود 4 ساعت روی سیستم 800Mhz من وقت میبره. تازه کلی مخلفات جانبی و همچنین دانلود داشتم. صدها مگابایت فقط حجم Microsoft DirectX SDK هایی بوده که دانلود کردم (نسخه های مختلفی رو تست کردم). آخرین DirectX SDK که تاریخش 2008 هست، به تنهایی حدود 500MB حجم داره.

مصمم بودم بالاخره کیوت رو به فونون مجهز کنم. منتها با MinGW، نه با Microsoft VC.
گزینهء میکروسافت ویژوال سی++ رو گذاشته بودم بعنوان آخرین راه چاره. انحصاریه دیگه نه؟

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

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

اما من یه کار دیگه هم کردم که بنظرم خیلی جالب و مفیده و واقعا بهش نیاز بود.
اونم اینه که پکیج و برنامه ای ساختم که محتوی تمام فایلها و ابزارهای لازم برای کامپایل مجدد Qt SDK با MinGW جهت اضافه کردن فونون به کیوت هست.
جالب اینکه این پکیج پس از فشرده شدن فقط حدود 6 مگابایت حجم داره. تنها فایلهای لازم رو از DirectX SDK رو در این پکیج گذاشتم که علت اصلی کم شدن حجم اونه (کس دیگری تاحالا حتی اینکار راحت رو هم نکرده).
و مزیت بزرگ دیگر این پکیج اینه که بطور خودکار و خیلی راحت و حتی همراه یکسری امکانات و ویژگیهای مفید، این امکان رو میده که کیوت رو بدون نیاز به دانش فنی و مهارتهای مربوطه کامپایل مجدد کنیم.

کار کامپایل مجدد کیوت و اضافه کردن phonon بهش از چیزی که فکر کنید سخت تره و مشکلات و نکات زیادی داره که جایی مطرح نشده؛ راهنماهای ارایه شده خیلی مبهم و ناقص هستن. اونهایی که راهنماها رو نوشتن خودشون توی کار و خبره بودن و ضمنا تمام حالات و پیکربندی ها رو هم تست و ذکر نکردن.

اما با پکیجی که من درست کردم همه چیز خیلی راحتتر شده.
خودتون ببینید و قضاوت کنید.
مزایاش:
- مجتمع شدگی تمام مواد اولیه و ابزارها که پیدا کردن و دانلود و استفاده از هرکدوم خودش دردسری هست؛ بخصوص برای افرادی که بقدر کافی دانش پایه و مهارت بخصوص در ابزارهای دنیای نرم افزار آزاد ندارن.
- حجم بسیار کمتر نسبت به دانلودی که شما برای اون مواد و ابزارها بر طبق راهنماهای اینترنتی باید انجام بدید. البته عمدهء این حجم به DirectX SDK مربوط میشه که چندصد مگابایت هست. اما حجم پکیجی که بنده تهیه کردم پس از فشرده سازی فقط 6 مگابایت هست و توش فقط فایلهای لازم رو از DirectX SDK گذاشتم.
- خودکار بودن کامل عملیات: نیاز به هیچ تخصص و وارد کردن فرمانهای طولانی و پیچیده و با ترتیب خاص نیست و برنامه اینکارها رو برای شما انجام میده. فقط باید بتونید دستورالعمل های ابتدایی برنامه رو که به زبان انگلیسی هست تشخیص بدید. البته من توضیح فارسی اون رو هم در انتهای این پست میذارم.
- امکانات اضافه: گزینهء شات داون کردن خودکار سیستم که با توجه به اینکه عملیات ساخت معمولا چند ساعت طول میکشه ممکنه نیاز باشه + لاگ کردن زمانهای شروع فرمانها که میشه میزان زمانی رو که هر فرمان مصرف کرده بعدا از روش محاسبه کرد + گزینهء فرستادن خروجی فرمانهای ساخت به فایل لاگ که بعدا به عیب یابی و تشخیص پیکربندی ساخت خیلی کمک میکنن.

پکیج رو از يكي از اين مكانها دریافت کنید:

http://www.4shared.com/file/120723456/67d686b4/phonon4qtmingw.html

http://rapidshare.com/files/260156018/phonon4qtmingw.zip

http://flashqard-project.org/uploads/folaani/phonon4qtmingw.zip

سایت این لینک دانلود آخر مال یکی از دوستان عزیز هست که لطف کرد و پکیج منو روی سایتش آپلود کرد؛ خود سایت و پروژه ای که سایت درموردش هست ربطی به بنده یا پکیج phonon4qtmingw نداره.


یادتون باشه شما باید یک نسخهء اخیر از Qt SDK رو بطور کامل نصب کنید و قبلا هم پیکربندی و کامپایلش نکرده باشید تا احیانا تداخلی در کار این برنامه ایجاد نکنه.
من روی qt-sdk-win-opensource-2009.03 (محتوی نسخهء 4.5.2 کیوت) تست کردم.
اگر مشکلی یا تغییری در نسخه های بعدی بود به من اطلاع بدید.

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

روش استفاده از این پکیج و برنامه به اینصورت هست:

- پکیج رو روی هارد اکسترکت کنید (مکانش فرقی نمیکنه)

- فایل install.cmd رو از داخل دایرکتوری پکیج با دابل کلیک کردن اجرا کنید (توجه: از طریق خط فرمان فراخوانی نکنید! فقط از طریق محیط گرافیکی ویندوز و با کلیک)
بلافاصله بعد از یکبار اجرا، میتونید پنجرهء مربوط به install.cmd رو با کلیک کردن روی دکمهء close ببندید (البته بهتره قبلا توضیحاتش رو بخونید).

- حالا خط فرمان کیوت رو باز کنید و فرمان phonon4qt رو وارد کنید.

- در پرسش اول میپرسه که آیا میخواید بعد از کامپایل، سیستم بطور خودکار خاموش بشه یا نه؛ حرف y رو برای تایید وارد کنید و هر حرف دیگری رو برای عدم تایید.

- در پرسش بعدی میپرسه که آیا میخواید خروجی فرمانهای ساخت (configure و mingw32-make) هم به فایل لاگ فرستاده بشه (نتیجتا دیگه در کنسول دیده نمیشن).

- حالا منتظر باشید تا عملیات کامپایل تمام بشه؛ میتونید در این مدت برید به کارهای دیگرتون برسید. حواستون باشه سیستم در این مدت خاموش نشه و پنجرهء کنسول رو هم اشتباهی نبندید.

لطفا هر مشکل و سوالی رو در اینجا مطرح کنید و اگر برنامه درست کار نمیکرد بگید.
ضمنا سورس دو برنامهء خیلی ساده برای تست صوت و ویدئو در پکیج برنامه هست که میتونید کامپایل و تست کنید. یادتون نره فایلهای ویدئو و صوت لازم رو در اختیار این برنامه ها بذارید.

نکته: چون این برنامه کیوت رو در حالت release کامپایل میکنه، فقط از خط فرمان mingw32-make release برای ساخت برنامه های خودتون استفاده کنید.

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

هرکس که میتونه و مایل هست لطفا این پکیج رو دانلود و روی سیستم ویندوزش تست کنه: http://rapidshare.com/files/258404056/release.zip.html
حجم: حدود 8 مگابایت
این محتوی یک برنامهء خیلی سادهء کامپایل شده برای تست ویدئو با فونون هست. تمام دی ال ال های لازم هم همراهش هست و نیاز نیست روی ویندوزتون کیوت داشته باشید یا برای مجهز شدن به phonon کامپایل مجددش کنید.
من با ویدئو روی سیستم خودم مشکل دارم و تصویر قاطه! اما روی دوتا سیستم دیگه که تست کردم ظاهرا مشکل نداره. ولی از طرف دیگه بازهم مطمئن نیستم و شاید روی سیستمهای قدیمی یا کارت گرافیک خاصی مشکل داره. بهرحال میخوام مطمئن بشم آمار این مشکل زیاد نیست و باگ جدی ای در فونون کیوت که کامپایل کردم وجود نداره.
لطفا نتیجه رو با ذکر مشخصات سخت افزار و سیستم عامل خودتون در اینجا درج کنید.

eshpilen
شنبه 01 خرداد 1389, 00:42 صبح
..............

eshpilen
شنبه 01 خرداد 1389, 00:42 صبح
برای ساده ترین حالت پخش صوت و با فرمت wav در برنامه های کیوت میتونیم از کلاس QSound استفاده کنیم. بنظرم مثلا موقعیکه فقط نیاز داریم که دکمه هایی که کاربر کلیک میکنه صدای کوتاهی بدن و غیره.
اما برای کارهای پیچیده تر و پشتیبانی از فرمتهای دیگر، همونطور که گفتم باید از Phonon استفاده کنیم که خوشبختانه موفق به مجهز کردن کیوت نسخهء اپن سورس با MinGW به این امکان خاص شدیم.

من فعلا تنها مورد QSound رو معرفی میکنم:


#include <QApplication>
#include <QSound>
#include <QLabel>
#include <QDebug>

int main(int argv, char **args) {
QApplication app(argv, args);

QSound::play("test.wav");

QLabel l("do you hear the sound?");
l.show();

return app.exec();
}

در اینجا ما از متد استاتیک QSound برای پخش صوت استفاده کردیم که نتیجتا بلافاصله با اجرای برنامه صدا هم پخش میشه.
اما برای کنترل بیشتر، میتونیم یک شیء QSound با نام فایل مورد نظر ایجاد کنیم و بعد از متدهای play و stop استفاده کنیم که چون این متدها از نوع SLOT هستن میتونیم مثلا یک دکمه رو مستقیما به اونها اتصال بدیم (با استفاده از متد استاتیک QObject::connect که ضمنا در تمام کلاسهای کیوت هم بخاطر مشتق شدگی از QObject بهش دسترسی مستقیم داریم).

eshpilen
شنبه 01 خرداد 1389, 00:43 صبح
.................

eshpilen
شنبه 01 خرداد 1389, 00:44 صبح
میشه گفت کیوت سه روش برای ایجاد تایمر داره؛ QTimer، QBasicTimer و تایمر درونی QObject.
تایمر عمومی و استاندارد در کیوت QTimer هست که امکانات و انعطاف لازم رو برای تایمرهای حرفه ای مختلف داره.
اما گاهی نیاز به یک تایمر داریم که بسادگی تابعی رو در فواصل زمانی معین اجرا بکنه و برنامهء ما احتمالا ساده تر و کوچکتر از اونه که بخوایم یک کلاس اختصاصی با اسلات (Slot) مخصوص تایمر تعریف کنیم و تعریف اون رو در یک فایل جداگانه قرار بدیم و بعد یک QTimer رو هم به برنامه اضافه کرده و به اسلات کلاس خودمون متصل کنیم. احتمالا برنامهء ما کوچک و ساده هست یا یک برنامهء آزمایشی یا برای تست چیزی و میخوایم سریع و راحت و مختصر در تنها یک فایل تمام برنامهء خودمون رو گنجانده و کامپایل کنیم.
در اینگونه موارد میتونیم از تایمر درونی QObject استفاده کنیم. هر کلاس مشتق شده از QObject که عملا شامل تمامی کلاسهای خود کیوت هم میشه دارای امکان یک تایمر داخلی ساده هست.
این تایمر با تابع startTimer در QObject بکار میفته، و با فاصلهء زمانی تعیین شده تابع timerEvent رو مکرارا فراخوانی میکنه.

بعنوان نمونه این کد:



#include <QApplication>
#include <QLabel>
#include <QBasicTimer>

class TimerTest : public QObject
{

public:
TimerTest(QWidget *p, float t) {
this->p=p;
startTimer(int(t*1000));
}

void timerEvent(QTimerEvent *) {
p->setVisible(!p->isVisible());
}

QWidget *p;

};

int main(int argv, char **args) {
QApplication app(argv, args);

QLabel l("Blinking...");
l.setAlignment(Qt::AlignHCenter);
l.show();
TimerTest t(&l, .5);

return app.exec();
}


یک پنجرهء کوچک ایجاد میکنه که هر نیم ثانیه ظاهر و ناپدید میشه (نکته: چون این تنها پنجره و بنابراین پنجرهء اصلی برنامهء ما هم هست، دکمه برنامهء ما در Taskbar ویندوز هم هر بار با نامریی شدن پنجره حذف شده و با پدیدار شدنش دوباره ظاهر میشه).
همونطور که میبینید ما کلاس TimerTest خودمون رو از QObject مشتق کردیم تا امکانات QObject رو، در اصل تنها بخاطر تایمر درونی اون، به کلاس خودمون اضافه کنیم.

------------------------------

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

eshpilen
شنبه 01 خرداد 1389, 00:45 صبح
..........

eshpilen
شنبه 01 خرداد 1389, 00:46 صبح
این یک برنامهء کوچکه که با Qt نوشته شده.
یک بازی ساده هست که در بخش خودآموز کیوت بعنوان مثال آورده شده بود؛ اما ویژگیهای متعددی رو که بعضی از اونها بعنوان تمرین مطرح شده بودن بهش اضافه کردم.
شاید بتونه بعنوان یک نمونه، قابلیت ها و انعطاف کیوت و همچنین رابطهء اونها با حجم کد رو نشون بده. از امکانات متنوعی از کیوت درش استفاده شده که باعث میشه مثال کوچک خوبی بنظر برسه.

کد منبع: http://www.4shared.com/file/121873212/9f9bcd0a/qtcannon-src.html

پکیج اجرایی (ویندوز): http://www.4shared.com/file/121872586/f4c7c3ba/qtcannon-bin.html

http://www.freeimagehosting.net/uploads/th.50e9d99ce8.png (http://www.freeimagehosting.net/image.php?50e9d99ce8.png)

eshpilen
شنبه 01 خرداد 1389, 00:47 صبح
............

eshpilen
شنبه 01 خرداد 1389, 00:47 صبح
حتما تابحال برنامه هایی رو دیدید که موقعی که میخوایم سیستم رو shutdown یا logoff بکنیم پیام میدن و مثلا میگن فایلهای شما save نشده و میخواید چکار کنید.
حداقل بعضی از این برنامه ها (مثلا نوتپد ویندوز) حتی این امکان رو هم میدن که عملیات shutdown یا logoff رو cancel کنیم.
شما میتونید بوسیلهء کیوت هم چنین امکانی رو در برنامه هاتون قرار بدید.
این یک نمونه کد و برنامهء ساده هست که چگونگی انجام اینکار رو نشون میده:


#include <QApplication>
#include <QMessageBox>
#include <QSessionManager>
#include <QLabel>

class MyApp : public QApplication
{
public:

MyApp(int argc, char *argv[]) : QApplication(argc, argv) {}

void commitData(QSessionManager& manager) {
if(manager.allowsErrorInteraction()) {
int ret = QMessageBox::warning(
0, "My Application", "Realy quit and shutdown/log off?", QMessageBox::Yes|QMessageBox::No
);
if(ret==QMessageBox::No) manager.cancel();
}
else {
// we did not get permission to interact, then
// do something reasonable instead
}
}
};

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

QLabel lbl("This is my Qt application.");
lbl.show();

return app.exec();
}

همونطور که میبینید، ما تابع QApplication::commitData رو Reimplement کردیم.
برای آگاهی بیشتر به مستندات کیوت مراجعه کنید.
چند نکته که من در آزمایشهای خودم بدست آوردم اینهاست:
- این روش تنها برای شات داون یا لاگ آف از طریق محیط گرافیکی کار میکنه و مثلا اگر فرمان شات داون از خط فرمان فراخوانی شده باشه برنامه بدون امکان مقاومت بسته میشه.
- اگر برنامهء شما از نوع خط فرمان باشه یا اصولا در پس زمینه اجرا میشه، باید حداقل یک عنصر GUI در برنامتون قرار بدید تا این روش بازهم کار کنه. برای اینکه این جزء گرافیکی دیده نشه و در برنامه های خط فرمان یا مخفی و پس زمینهء ما اختلالی ایجاد نکنه من چنین ترفندی رو بکار گرفتم:


#include <QApplication>
...
#include <QSplashScreen>

class MyApp : public QApplication
{
...
};

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

QSplashScreen* spl=new QSplashScreen;
spl->show();
delete spl;

return app.exec();
}

eshpilen
شنبه 01 خرداد 1389, 00:48 صبح
................

eshpilen
شنبه 01 خرداد 1389, 00:49 صبح
این پست یک مثال از تبادل اطلاعات با وب هست.
یک کاربرد جالب و مهم که بعضی وقتا بهش نیاز داریم آپلود کردن یک فایل از روی رایانه به سایت مورد نظر هست.
چون مثالی برای آپلود فایل در رفرنس کیوت نیامده و نمونه کدهایی هم که در اینترنت پیدا کردم با استفاده از کلاس QHttp بود من این مثال رو برای استفاده از QNetworkAccessManager تطبیق دادم.
QNetworkAccessManager کلاسی با رابط سطح بالاتری هست که شما باید در اغلب برنامه هاتون استفاده کنید؛ مگر اینکه نیاز به ارتباط سطح پایینتری برای تبادل اطلاعات با وب داشته باشید که در چنان صورتی از کلاسهای دیگه مثل QHttp استفاده میکنید.

این برنامه یک فایل با نام test.txt رو که در دایرکتوری جاری قرار داره به سرور آپلود میکنه.
البته محدودیتی وجود نداره که فایل ما فقط از نوع متنی باشه؛ هر نوع فایل دیگری میتونه باشه.

فایلهای کد برنامه:

فایل main.cpp:

#include <QApplication>

#include "uploader.h"

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

Uploader u;

return app.exec();
}

فایل uploader.h:

#include <QFile>
#include <QObject>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <qdebug.h>
#include <QNetworkReply>
#include <QBuffer>
#include <QApplication>

class Uploader : public QObject
{
Q_OBJECT

public:

Uploader() {
uploadManager = new QNetworkAccessManager(this);
connect(uploadManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(uploadFinished(QNetworkReply*)));
postData=new QByteArray;
buffer=new QBuffer(postData, this);
QFile *file=new QFile("test.txt");
file->open(QIODevice::ReadOnly);
boundary = "----xmdjekop098356td----";
(*postData)=QString("--" + boundary + "\r\n").toAscii();
(*postData) += "Content-Disposition: form-data; name=\"test\"; filename=\"test.txt\"\r\n";
(*postData) += "Content-Type: text/plain\r\n\r\n";
(*postData) += file->readAll();
(*postData) += "\r\n";
(*postData) += QString("--" + boundary + "--\r\n").toAscii();
buffer->open(QBuffer::ReadOnly);
QNetworkRequest req(QUrl("http://localhost/upload.php"));
req.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary="+boundary);
qDebug()<<"uploading result...";
uploadManager->post(req, buffer);
}

public slots:

void uploadFinished(QNetworkReply* r) {
if(r->error()) {
qDebug()<<"Upload network error: "<<r->error();
r->deleteLater();
qApp->exit(1);
return;
}
qDebug()<<"upload reply: "<<r->readAll();
r->deleteLater();
qApp->exit(0);
}

private:
QNetworkAccessManager* uploadManager;
QBuffer* buffer;
QByteArray* postData;
QString boundary;
};

محتویات فایل پروژه:

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += uploader.h
SOURCES += main.cpp
QT+=network
CONFIG+=console

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

اینهم نمونهء بسیار ساده شده ای از برنامهء سمت سرور ما که فایل آپلود شده رو دریافت و ذخیره میکنه.
شما برای تست برنامهء آپلودر کیوت به چنین اسکریپت یا برنامهء دیگری هم در سمت سرور نیاز دارید.
نام فایل upload.php هست که در دایرکتوری ریشهء localhost ذخیره میکنیم:

<?php

if (move_uploaded_file($_FILES['test']['tmp_name'], 'test.txt')) echo 'uploaded successfully.';
else echo 'upload failed!';

?>

eshpilen
شنبه 01 خرداد 1389, 00:49 صبح
...................

eshpilen
شنبه 01 خرداد 1389, 00:50 صبح
در اینجا میخوایم برای اینکه مطالب مقدماتی کیوت کامل باشن کمی هم درمورد استفاده از رابط های کاربری ای که بصورت ویژوال طراحی شدن صحبت کنیم. این رابطها با نرم افزار Qt Creator ایجاد میشن. البته در نسخه های قدیمی تر کیوت برنامهء جامع Qt Creator وجود نداشت و بجاش فقط برنامهء Qt Designer رو داشتیم. بهرحال در عمل برای کاربرد ایجاد رابطهای کاربری گرافیکی این دوتا فرقی نمیکنن. Qt Creator برنامهء جامعتری برای ایجاد برنامه های دسکتاپ هست که Qt Designer قدیم رو هم درواقع در داخل خودش مجتمع کرده و Qt Designer دیگه یک برنامهء مجزا که بطور مستقل در دسترس باشه نیست.

طرز استفادهء کامل از Qt Creator و طراحی ویژوال رابط گرافیکی توسط اون رو خودتون باید یاد بگیرید و این تاپیک همونطور که از ابتدا گفتم، به این مسائل نمیپردازه. اما من یک مثال کوچک از بکارگیری رابطهای طراحی شده به روش ویژوال رو در اینجا نشون میدم.

Qt Creator رو اجرا کنید.
از منوی File گزینهء New رو انتخاب کنید.
Qt Designer Form رو انتخاب کنید.
Widget رو انتخاب کنید.
یک دایرکتوری برای ذخیره ایجاد/انتخاب کنید.
طراحی ویژوال: یک دکمه روی فرم (صفحهء رابطی که میخواید طراحی کنید) خودتون قرار بدید.
نام این دکمه رو pb بذارید (مقدار فیلد objectName).
خب حالا کار طراحی فرم ما تموم شده و میتونید فرم خودتون رو سیو کرده و برنامهء Qt Creator رو ببندید.

چون من در اینجا میخوام فقط طرز استفاده از فرمهای تولید شده رو در سورس برنامه ها نشون بدم، بقیهء کارها رو به روش خیلی پایه ای استفاده از خط فرمان کیوت انجام میدم، وگرنه میشه بقیهء فایلهای برنامه رو هم با استفاده از Qt Creator ایجاد و در همون محیط کدنویسی کرد و مراحل کامپایل رو هم از طریق Qt Creator براحتی انجام داد (البته خودم هنوز تست نکردم!!).

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

الان ما باید یک فایل با پسوند ui در دایرکتوری ای که Qt Creator انتخاب کرد یا ما براش انتخاب کردیم داشته باشیم. این فایل محتوی شرح رابط کاربری طراحی شده توسط شما، در فرمت XML هست. این فایلهای ui یا موقع ساخت برنامه به فایل و کدهای سی++ متناظر ترجمه و بعد کامپایل میشن و یا میتونن موقع اجرای برنامه بطور دینامیک لود و اجرا بشن. ما در اینجا به حالت اول، یعنی تبدیل و کامپایل اولیه میپردازیم چون بنظرم عمومی تر و بهینه تر هست.

فایل من اسمش form.ui هست که در دایرکتوری ای با نام test روی دسکتاپم ذخیره شده.
وقتی من اقدام به ساخت برنامه بکنم یک فایل به نام ui_form.h از روی این فایل ایجاد خواهد شد که محتوی یک کلاس با نام Form خواهد بود که این کلاس کدهای سی++ معادل رابط گرافیکی ای رو که بصورت ویژوال طراحی کردیم در خودش داره.

حالا من یک فایل با نام myui.h در دایرکتوری برنامه ایجاد میکنم که محتویاتش اینهاست:


#include <QWidget>
#include "ui_form.h"

class myUi : public QWidget, private Ui::Form
{
Q_OBJECT

public:
myUi(QWidget *parent = 0) : QWidget(parent)
{
setupUi(this);
}

private slots:
void on_pb_clicked() {
qApp->quit();
}

};

در خط یک و دو اینکلودهای لازم رو انجام دادیم.
ما نیاز داریم یک کلاس درست کنیم (اسم این کلاس رو myUi گذاشتم) که ترکیبی از QWidget یا (هر کلاس رابط گرافیکی دیگری که میخوایم) باشه که فرم ما نیاز داره اون رو بعنوان Parent خودش داشته باشه و بعد بتونیم اجزای دیگری رو هم که میخوایم، بدون نیاز به دستکاری فایل فرم مورد نظر به کلاس خودمون اضافه کنیم؛ بنابراین ما کلاسی میسازیم (خط 4) که ترکیبی از هردوی QWidget و کلاس تعریف شده در ui_form.h باشه.
private در private Ui::Form میگه که اجزای کلاس رابط گرافیکی طراحی شده باید فقط از داخل این کلاس ترکیبی در دسترس باشن (این یک طراحی استاندارد و اصولی بحساب میاد).
فضای نامی Ui هم در ui_form.h تعریف شده؛ بهتره به محتویات ui_form.h خوب نگاه کنید (این فایل موقع اجرای فرمان mingw32-make release تولید میشه). چیز حجیم و پیچیده ای داخلش نیست که قابل درک یا نوشتن توسط خودمون نباشه!
حتما یادتون هست که در تعریف کلاسهایی که در اونها سیگنال و اسلات (Signals and Slots) ایجاد میکنیم به ماکروی Q_OBJECT نیاز داریم. ضمنا یک نکتهء ریز قابل ذکر اینه که فایلی که این ماکرو درش هست باید پسوند h داشته باشه (قبلا در این تاپیک گفتم چرا).
در constructor ما setupUi رو که عضو کلاس تعریف شده در ui_form.h هست فراخوانی میکنیم و کلاس جاری رو که یک شیء رابط کاربری گرافیکی هست (باید از QWidget ارث بری داشته باشه) بعنوان Parent بهش پاس میکنیم.
کار setupUi اینه که اجزای رابط گرافیکی ما رو در کلاس Ui::Form ایجاد میکنه؛ بعد از این مرحله ما به این اجزاء (مثلا دکمهء خودمون) از داخل کلاس خودمون هم دسترسی مستقیم داریم. مثلا میتونیم این کد رو بکار ببریم:


pb->setText("Quit app!");

البته این یه مثال بود و بدیهی هست که برچسب روی دکمه رو میتونستیم در همون Qt Creator براحتی تعیین کنیم.
در خط 16 ما اسلاتی رو تعریف کردیم و الگوی خاص نامگذاری این اسلات (به کلمات اضافه شده در سمت چپ و راست pb توجه کنید) باعث میشه که سیگنال clicked دکمه ای که ما قبلا طراحی کرده بودیم و اسمش رو pb گذاشته بودیم بطور خودکار به این اسلات متصل بشه.
ضمنا کار این اسلات اینه که خیلی ساده باعث خروج از برنامه میشه و بنابراین با کلیک بر روی دکمه، باید برنامه خاتمه پیدا کنه و اینطوری میفهمیم که کار اتصال خودکار سیگنال و اسلات در برنامهء ما واقعا انجام شده.

خب نهایتا ما یک فایل main.cpp هم داریم:


#include <QApplication>
#include "myui.h"

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

myUi ui;
ui.show();

return app.exec();
}

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

حالا فایل اجرایی برنامه رو در خط فرمان کیوت ساخته و اجرا میکنیم.
برای اینکار، خط فرمان کیوت رو اجرا کرده و prompt (اعلان خط فرمان) رو به دایرکتوری test میبریم و بعد فرمانهای زیر رو به ترتیب اجرا میکنیم:


qmake -project
qmake
mingw32-make release
release\test.exe

eshpilen
شنبه 01 خرداد 1389, 00:50 صبح
..........

eshpilen
شنبه 01 خرداد 1389, 00:51 صبح
این پست درمورد اینه که چطور برای فایل exe خودمون آیکون بذاریم.
انجام این کار خوشبختانه خیلی ساده است:
- فایل آیکون خودتون رو با فرمت ico ایجاد و در دایرکتوری پروژه ذخیره کنید؛ در اینجا فرض کنید که نامش myappico.ico هست.
- یک فایل متن، در اینجا با نام myapp.rc، ایجاد کنید که خط زیر درونش باشه:


IDI_ICON1 ICON DISCARDABLE "myappico.ico"

- خط زیر رو به فایل پروژه اضافه کنید:


RC_FILE = myapp.rc

- دستورات زیر رو برای تولید make file و فایل اجرایی برنامه اجرا کنید:


qmake
mingw32-make release

eshpilen
شنبه 01 خرداد 1389, 00:52 صبح
............

eshpilen
شنبه 01 خرداد 1389, 00:55 صبح
توضیح: پست تاریخچه ای (مشکل Phonon در نسخه های اخیر کیوت کاملا حل شده و نیازی به استفاده از این برنامه/پکیج نیست)

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

يك نسخهء جديد از phonon4qtmingw رو تهيه كردم.
تغييرات:
- يك باگ كه در محيط 64 بيتي گزارش و مشخص شده بود برطرف شد.
- امكان كامپايل كتابخانه هاي مخصوص Debug هم كه تقريبا ضروري بود و اشتباه كردم در نسخهء اوليه نذاشتم، اضافه شد.
الان ديگه لازم نيست برنامه هاتون رو فقط درحالت release كامپايل كنيد.
حالا اولين سوالي كه بعد از اقدام به اجراي phonon4qt پرسيده ميشه اينه كه آيا ميخوايد فقط درحالت release كامپايل كنيد يا خير (كامپايل در حالت release only حدود 50% زمان كمتري ميبره).
وجود حالت release only براي بعضي تست ها و حتي رفع بعضي مشكلات ممكن هم ميتونه مفيد باشه. بنابراين من اين حالت رو بصورت گزينه در برنامه باقي گذاشتم.
- كتابخانه هاي توسعهء دايركت ايكس 64 بيتي حذف شدن. چون ظاهرا كيوت از كامپايل بصورت 64 بيت روي ويندوز پشتيباني نميكنه. ولي نگران نباشيد چيز مهمي نيست و مانعي براي كامپايل و استفاده از كيوت همراه با phonon روي سيستمها و ويندوز 64 بيتي وجود نداره. البته تست نكردم چون سيستم و ويندوز 64 بيتي ندارم (هركس تست كرد اطلاع بده تا مطمئن بشيم).
ضمنا با حذف اين كتابخانه ها حجم پكيج حتي كمتر شده و به 3 مگابايت رسيده!

لينك دانلود نسخهء جديد:
4shared.com - online file sharing and storage - download phonon4qtmingw--2.zip (http://www.4shared.com/file/146674858/b2a00a06/phonon4qtmingw--2.html)

eshpilen
شنبه 01 خرداد 1389, 00:55 صبح
....................

eshpilen
شنبه 01 خرداد 1389, 00:56 صبح
توضیح: پست تاریخچه ای (مشکل Phonon در نسخه های اخیر کیوت کاملا حل شده و نیازی به استفاده از این برنامه/پکیج نیست)

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

نسخه جديدي از phonon4qtmingw ساخته شد:
4shared.com - online file sharing and storage - download phonon4qtmingw--3.zip (http://www.4shared.com/file/161942847/2f1b88fc/phonon4qtmingw--3.html)
اين نسخه اساسا با نسخه هاي قبلي فرق داره و از روش متفاوتي استفاده ميكنه. و بخاطر اينكه فقط بخشهايي از Qt رو كه براي ساخت phonon لازم هستن كامپايل ميكنه سرعتش خيلي بالاتر رفته.
اين برنامه هرچند داراي روش غيراستاندارد و تجربي هست اما روي qt-sdk-win-opensource-2009.04 و دو سيستم متفاوت با ويندوز XP سرويس پك 2 و 3 تست كردم و ظاهرا كار ميكنه و مشكلي نيست. خلاصه چند بار تاجايي كه ميتونستم تست كردم.
بهرحال اگر كسي تست كرد لطفا نتيجه رو اطلاع بده كه اگر مشكلي بود سعي كنم روش استاندارد رو بررسي كنم.
اين پكيج رو ابتدا با روش استانداردتري ساخته بودم، اما يك مرحله (configure) زمان زيادي ميبرد (حدود 40 دقيقه روي يك سيستم 800 مگاهرتزي) چون روي كل Qt اعمال ميشد و نه فقط بخشهايي كه براي ساخت phonon لازم هستن و بنابراين سعي كردم با يك روش ابتكاري دستي جايگزينش كنم كه ظاهرا موفق شدم، ولي بهرحال چون روش غيراستاندارد و تجربي هست فقط تست و استفاده عملي پشتوانهء اون هست و تضميني نيست با نسخه هاي بعدي Qt هم كار كنه (اما احتمالا ميتونم ارتقاش بدم).
سرعتش واقعا فوق العاده شده! تنها چند دقيقه روي يك سيستم امروزي قوي . يا مثلا حدود 15 دقيقه روي يك سيستم 800 مگاهرتزي قديمي بنده كه قبلا حدود 7 ساعت زمان ميبرد!
البته اينم بگم كه ممكنه بعدا تنظيمات بيشتري از برنامهء configure رو پيدا كنم كه بدرد اينكار بخورن و روش غيراستاندارد رو با روش استاندارد (استفاده از configure) جايگزين كنم؛ ولي فعلا اطلاعات كافي در اين زمينه نداشتم (احتمالا بزودي جستجو ميكنم و ميپرسم).

eshpilen
شنبه 01 خرداد 1389, 00:57 صبح
..........

eshpilen
شنبه 01 خرداد 1389, 00:58 صبح
یکی از دوستان درمورد چگونگی استفاده از سرورهای SQL مثل MySQL و اوراکل و غیره در Qt پرسیده بودن. این پرسش منجر به تحقیق و تست و درج مطالبی در چند پست در اینمورد شد که خلاصهء مفید اونها رو در این پست ارائه میکنم.

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

The table below lists the drivers included with Qt. Due to license incompatibilities with the GPL, not all of the plugins are provided with the Qt Open Source Edition.

Driver name DBMS
QDB2 IBM DB2 (version 7.1 and above)
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity (ODBC) - Microsoft SQL Server and other ODBC-compliant databases
QPSQL PostgreSQL (versions 7.3 and above)
QSQLITE2 SQLite version 2
QSQLITE SQLite version 3
QTDS Sybase Adaptive Server

Note: To build a driver plugin you need to have the appropriate client library for your Database Management System (DBMS). This provides access to the API exposed by the DBMS, and is typically shipped with it. Most installation programs also allow you to install "development libraries", and these are what you need. These libraries are responsible for the low-level communication with the DBMS.

مورد تست دیتابیس MySQL بوده.
ما ابتدا از ODBC برای اتصال به MySQL استفاده میکنیم.
ابتدا درایور ODBC مربوطه را دانلود میکنیم:

http://mysql.he.net/Downloads/Connector-ODBC/5.1/mysql-connector-odbc-5.1.6-win32.msi
درج این آدرس بخاطر این بود که دسترسی به لینک دانلود بخاطر تحریم کمی مشکل بود (نیاز به فیلترشکن)، وگرنه بطور معمول خودتون باید جستجو و نسخهء مناسب رو از مکان مناسب دانلود کنید.
بعد از نصب و انجام تنظیمات ODBC لازم در ویندوز (این بخشها به خود کیوت مربوط نمیشن و توضیح نمیدم)، میتونیم با چنین کد تست ساده و مختصری برقراری اتصال و دسترسی موفق رو بررسی کنیم:

#include <QtSql>
#include <QApplication>
#include <QDebug>

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

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("mysqlxx");
if(!db.open()) {
qDebug("error in opening!");
QSqlError err=db.lastError();
qDebug()<<err.databaseText();
qDebug()<<err.driverText();
return 1;
}
else qDebug("success");

QSqlQuery query;
query.exec("SELECT * FROM counter");

while (query.next()) {
QString c = query.value(0).toString();
qDebug() << c << '\n';
}

qDebug("-------------end---------------\npress Ctrl+C to exit!");

return app.exec();
}
در قسمت setDatabaseName توجه میکنیم که بجای نام دیتابیس اصلی نامی رو که برای data source name در تنظیمات ODBC ویندوز انتخاب کردیم بهش میدیم. ضمنا ظاهرا دیگه نیازی به یوزرنیم و پسورد MySQL هم نبود! (اگر لازم بود به نمونه کد روش بعدی مراجعه کنید).
یادتون باشه به فایل پروژهء این برنامهء تست این دو خط رو هم اضافه کنید:

QT += sql
CONFIG+=console


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

روش دیگر استفاده از درایور مخصوص خود MySQL هست.

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

اولا چون من از EasyPHP 2.0b1 برای محیط برنامه نویسی وب روی سیستم خودم استفاده میکردم و میدونیم که EasyPHP شامل وب سرور آپاچی همراه با ماجول PHP، و سرور دیتابیس MySQL هست، خواستم تا از همین نسخه از MySQL که همراه EasyPHP هست استفاده کنم. ضمنا من این نسخه از EasyPHP رو از قبل روی سیستم نصب داشتم و احتمالا الان دیگه قدیمی شده. نکتهء دیگه اینکه اگر شما فقط به یک سرور MySQL نیاز دارید و نه یک محیط برنامه نویسی وب، بهتره فقط یک سرور MySQL رو جداگانه نصب و اجرا کنید؛ استفاده از EasyPHP در اینجا فقط بخاطر این بوده که بنده برنامه نویسی وب هم میکنم و این برنامه از قبل روی سیستمم نصب بوده.
خب اول باید نسخهء MySQL رو بفهمیم. اینکار از راههای مختلفی امکان پذیر هست. احتمالا راحتترین راهش اینه که روی آیکون EasyPHP در تسکبار کلیک راست کرده و گزینهء Administration رو انتخاب کنید که در نتیجه در صفحهء باز شده نسخهء 5.0.27 رو برای من نشون میداد.
حالا باید هدرها و کتابخانه های مختص این نسخه از MySQL رو پیدا و دانلود کنیم.
من نهایتا پس از جستجو از این آدرس دانلودشون کردم:

http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.89-win32.zip/from/http://mysql.llarian.net/
این آدرس مستقیم رو بعنوان نمونه گذاشتم و ضمنا اینکه بعلت تحریم نیاز به استفاده از روشهایی مثل فیلترشکن برای رسیدن به این آدرس بود.
بعد از دانلود باید برنامهء نصبی رو که داخل فایل زیپ هست اجرا و اجزای MySQL رو نصب کنید (موقع نصب گزینهء Complete رو انتخاب کردم).

حالا اینکارها رو انجام میدیم:
- همهء فایلهای موجود در C:\Program Files\MySQL\MySQL Server 5.0\include رو به E:\Qt2009.05\qt\include کپی کنید.
مسلمه که آدرس محل نصب Qt SDK و MySQL که دانلود کردید ممکنه برای شما متفاوت باشه.
- از آدرس C:\Program Files\MySQL\MySQL Server 5.0\lib\opt فایل libmysql.lib رو به E:\Qt2009.05\qt\lib کپی کنید.
- از دایرکتوری C:\Program Files\MySQL\MySQL Server 5.0\lib\opt فایل libmysql.dll رو به E:\Qt2009.05\qt\bin کپی کنید.
- خط فرمان کیوت رو اجرا کرده و دایرکتوری جاری رو به E:\Qt2009.05\qt\src\plugins\sqldrivers\mysql تغییر بدید.
- فرمان qmake رو اجرا کنید.
- فرمان mingw32-make رو اجرا کنید.

بعد از تمام شدن اجرای این فرمانها کار تمامه!
اگر به دایرکتوری E:\Qt2009.05\qt\plugins\sqldrivers مراجعه کنید باید فایلهای مربوط به MySQL رو ببینید (درمورد مال من، 4 فایل هست که در نام اونها عبارت mysql وجود داره).
این هم یک برنامهء تست خیلی مختصر و ساده:

#include <QtSql>
#include <QApplication>

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

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("database1");
db.setUserName("mysql_username");
db.setPassword("mysql_password");
if(!db.open()) {
qDebug("error in opening!");
return 1;
}
else qDebug("success");

QSqlQuery query;
query.exec("SELECT * FROM table1");

while (query.next()) {
QString c = query.value(0).toString();
qDebug() << c << '\n';
}

qDebug("-------------end---------------\npress Ctrl+C to exit!");



return app.exec();
}
یادتون باشه به فایل پروژهء این برنامهء تست این دو خط رو هم اضافه کنید:

QT += sql
CONFIG+=console

بعد با فرمان qmake و بعد mingw32-make release برنامه رو کامپایل میکنیم (استفاده از release بخاطر بالا بردن سرعت کامپایل و سرعت اجرای برنامه هست).
بعد با فرمان release\test.exe برنامه رو تست میکنیم. البته حتما قبلش باید سرور MySQL درحال اجرا باشه (درمورد بنده یعنی EasyPHP اجرا شده باشه).
حالا فقط یادتون باشه وقتی برنامتون رو میخواید توزیع کنید باید علاوه بر dll های معمول و اونهایی که صریحا درخواست میکنه، حتما اینکارها رو هم انجام بدید:
- یک نسخه از libmysql.dll رو همراه برنامه قرار بدید (در دایرکتوری خود برنامه).
- یک دایرکتوری بنام sqldrivers در دایرکتوری برنامه ایجاد کرده و از آدرس E:\Qt2009.05\qt\plugins\sqldrivers فایل qsqlmysql4.dll رو به داخل این دایرکتوری کپی کنید.

eshpilen
شنبه 01 خرداد 1389, 00:58 صبح
............

eshpilen
شنبه 01 خرداد 1389, 01:04 صبح
سلام بر دوستان گرامی.
من شخصا با استفاده از کتابخانهء رمزگذاری مورد نظر در Qt مشکلات زیادی داشتم.
ظاهرا نسخهء کامپایل شدهء کتابخانهء معروف crypto++ که برای دانلود قرار داده شده (crypto++ یک کتابخانه رمزگذاری نوشته شده در زبان سی++ هست) توسط کامپایلر میکروسافت (MSVC) کامپایل شده و با کامپایلر پکیج mingw کار نمیکنه. بنابراین ما در استفاده از امکانات رمزگذاری این کتابخانه در برنامه های Qt خودمون به مشکل جدی برمیخوریم (بنظرم مگر اینکه Qt ما هم با MSVC کامپایل شده باشه).
اما خوشبختانه بنده پس از تلاشهای چندی بطور غیرمنتظره ای موفق به حل این مسئله شدم.
من این روش رو بصورت قدم به قدم برای هر جوینده ای درحال و آینده در این تاپیک قرار میدم.

شروع:

ابتدا پکیج cryptopp552.zip رو از سایت پروژهء crypto++ در sourceforge (ا Crypto++ | Get Crypto++ at SourceForge.net (http://sourceforge.net/projects/cryptopp/) ) دانلود کنید.
این پکیج محتوی فایلهای کد منبع این کتابخانه هست. حجمش هم حدود 1 مگابایت.

خب چرا این فایل؟
چون ظاهرا این آخرین نسخه از این کتابخانه بوده که توسط دیگران هم بصورت موفقیت آمیز با mingw کامپایل شده (اما من فرم کامپایل شدهء اون رو پیدا نکردم).

محتویات cryptopp552.zip رو به C:\cryptopp552 اکسترکت کنید.

حالا فایل C:\cryptopp552\fipstest.cpp رو با یک ویرایشگر مناسب باز کنید و تمام عبارات OutputDebugString رو به OutputDebugStringA تغییر بدید و فایل رو ذخیره کرده و ببندید. مجموعا سه تا از این عبارت ها در این فایل وجود داره.

فایل C:\cryptopp552\GNUmakefile رو دلیت کنید.

خط فرمان Qt رو باز کنید (من از Qt SDK 2009.05 استفاده کردم).
فرمانهای زیر رو به ترتیب در خط فرمان وارد کنید:


c:
cd \cryptopp552
qmake -project
حالا فایل cryptopp552.pro رو که با فرمان آخر در C:\cryptopp552 ایجاد شده برای ویرایش باز کنید و این کارها رو انجام بدید:

TEMPLATE = app رو به TEMPLATE = lib تغییر بدید.
یک خط با محتوای LIBS += -lws2_32 به انتهای این فایل اضافه کنید.

دوباره فرمانهای زیر رو در خطر فرمان Qt وارد کنید:


qmake
mingw32-make all
اجرای فرمان آخر بسته به سرعت سیستم شما دقایقی کم یا زیاد طول میکشه.

حالا ما باید فایلهایی با نام libcryptopp552.a و cryptopp552.dll در هر دوی فولدرهای C:\cryptopp552\release و C:\cryptopp552\debug داشته باشیم. تمام توابع و کلاسهای کتابخانهء crypto++ در همین یک فایل dll هست.

C:\cryptopp552\release\libcryptopp552.a رو به فولدر lib در فولدر Qt کپی کنید.
توجه کنید که یک فولدر دیگر بنام lib در یک سطح بالاتر از فولدر Qt در فولدر نصب Qt SDK وجود داره که نباید این دوتا رو با هم قاطی کنید. فایل رو باید در فولدر lib خود Qt بریزید اما اگر فایل رو در هر دو هم کپی کنید مشکلی پیش نمیاد.

فایل C:\cryptopp552\release\cryptopp552.dll رو به فولدر bin در فولدر Qt کپی کنید.
توجه کنید که یک فولدر دیگر بنام bin در یک سطح بالاتر از فولدر Qt در فولدر نصب Qt SDK وجود داره که نباید این دوتا رو با هم قاطی کنید. فایل رو باید در فولدر bin خود Qt بریزید اما اگر فایل رو در هر دو هم کپی کنید مشکلی پیش نمیاد.

یک فولدر بنام cryptopp در فولدر include که در فولدر Qt هست ایجاد کنید و تمام فایلهای هدر (فایلهایی با پسوند h) رو که در فولدر C:\cryptopp552 وجود دارن به داخل این فولدری که ایجاد کردید کپی کنید.

اکنون ما میتونیم crypto++ رو تست کنیم و ببینیم که چطور باید از اون در برنامه های Qt خودمون استفاده کنیم.

مثال اول برنامه ای هست که هش MD5 یک رشته رو (که در برنامه hard code شده) محاسبه و چاپ میکنه:

main.cpp


#include <iostream>

#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif
#include <cryptopp/md5.h>

USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)
const int MAX_PHRASE_LENGTH=250;

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

CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "Hello World!";

hash.CalculateDigest( digest, (const byte*)message.c_str(), message.length());

CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();

std::cout << "Input string: " << message << std::endl;
std::cout << "MD5: " << output << std::endl;

return 0;
}
کد برنامه برگرفته از: : Hash Functions - Crypto++ Wiki (http://www.cryptopp.com/wiki/Hash_Functions)

یادتون باشه قبل از اینکه شروع به مراحل کامپایل برنامه (معمولا با فرمانهای qmake و mingw32-make) بکنید باید این خطوط رو به فایل پروژهء اون (فایلی با پسوند pro) اضافه کنید:

LIBS += -lcryptopp552
CONFIG+=console

برنامه چنین خروجی ای رو باید در پنجرهء کنسول چاپ کنه:
Input string: Hello World!
MD5: ED076287532E86365E841E92BFC50D8C

مثال دوم برنامه ای هست که سه آرگومان که هر کدام نام/آدرس یک فایل هستن میگیره.
برنامه بعد از کاربر یک پسورد میخواد، بعد یک نسخهء رمز شده از فایل اول رو در فایل دوم ذخیره میکنه و بعد یک نسخهء از رمز درآمده از فایل دوم رو در فایل سوم ذخیره میکنه. یعنی اول رمز میکنه و بعد فایل رمز شده رو رمزگشایی میکنه.

خط فرمان نمونه ای که من استفاده کردم مثل این بوده:
release\cryptopptest.exe 1.jpg 2.jpg 3.jpg
فقط نیاز داریم که فایل اول رو داشته باشیم که در اینجا یک فایل تصویری بوده.

main.cpp


#include <iostream>

#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#include <cryptopp/default.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif

USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)

const int MAX_PHRASE_LENGTH=250;

void EncryptFile(const char *in,
const char *out,
const char *passPhrase);
void DecryptFile(const char *in,
const char *out,
const char *passPhrase);


int main(int argc, char *argv[])
{
try
{
char passPhrase[MAX_PHRASE_LENGTH];
cout << "Passphrase: ";
cin.getline(passPhrase, MAX_PHRASE_LENGTH);
EncryptFile(argv[1], argv[2], passPhrase);
DecryptFile(argv[2], argv[3], passPhrase);
}
catch(CryptoPP::Exception &e)
{
cout << "\nCryptoPP::Exception caught: "
<< e.what() << endl;
return -1;
}
catch(std::exception &e)
{
cout << "\nstd::exception caught: " << e.what() << endl;
return -2;
}
}


void EncryptFile(const char *in,
const char *out,
const char *passPhrase)
{
FileSource f(in, true, new DefaultEncryptorWithMAC(passPhrase,
new FileSink(out)));
}

void DecryptFile(const char *in,
const char *out,
const char *passPhrase)
{
FileSource f(in, true,
new DefaultDecryptorWithMAC(passPhrase, new FileSink(out)));
}

RandomPool & GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
int (*AdhocTest)(int argc, char *argv[]) = NULL;
کد برنامه برگرفته از: : Crypto++<sup></sup> Holds the Key to Encrypting Your C++‎ Application Data - CodeGuru (http://www.codeguru.com/cpp/misc/misc/cryptoapi/article.php/c11953/)

یادتون باشه قبل از اینکه شروع به مراحل کامپایل برنامه (معمولا با فرمانهای qmake و mingw32-make) بکنید باید این خطوط رو به فایل پروژهء اون (فایلی با پسوند pro) اضافه کنید:

LIBS += -lcryptopp552
CONFIG+=console

--------------------------------

موفق باشید.

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

پانوشت جدید: فایلهای dll آمادهء این کتابخانهء رمزنگاری رو که با MinGW کامپایل کردم میتونید از این آدرس دانلود کنید: http://www.4shared.com/file/Q46L93Z7/cryptopp522mingw-bin-nodebug.html (فقط نسخهء release که حجمش 2.5 مگابایت هست) و http://www.4shared.com/file/jp_Jsvdr/cryptopp522mingw-bin.html (محتوی dll های debug و release بصورت جداگانه - 12 مگابایت).
ویرایش: اینم رفرنس رسمی crypto++ v5.51 که تازگی آپلود کردم: http://www.4shared.com/file/S5jvueo-/CryptoPP551Ref.html

eshpilen
شنبه 01 خرداد 1389, 01:10 صبح
................

eshpilen
شنبه 01 خرداد 1389, 01:11 صبح
این یک تابع هست که من برای رمزگذاری یک فایل که در حافظه در یک QByteArray ذخیره شده بود نوشتم و تست کردم.
این تابع یک QByteArray و یک پسورد (هشدار: ممکنه با کاراکترهای غیرلاتین کار نکنه؛ تست نکردم) رو میگیره و بعد محتویات QByteArray رو رمز میکنه. یعنی نتیجهء رمزگذاری در همون QByteArray ذخیره میشه و تابع مقدار برگشتی ای نداره.
کلاسی از Crypto++ که برای این تابع استفاده شده کلاس DefaultEncryptorWithMAC هست که از این الگوریتم استفاده میکنه: DES-EDE2 and HMAC/SHA-1


void encrypt(QByteArray &in_out, const char *passPhrase) {

string tmp;
StringSource s((const byte *)in_out.constData(), in_out.size(), true, new DefaultEncryptorWithMAC(passPhrase, new StringSink(tmp)));
in_out.clear();
in_out.append(QByteArray(tmp.c_str(), tmp.size()));

}


برای رمزگشایی شما فقط بجای DefaultEncryptorWithMAC به یک DefaultDecryptorWithMAC نیاز دارید. بنابراین تابع رمزگشایی ما به شکل زیر هست:


void decrypt(QByteArray &in_out, const char *passPhrase) {

string tmp;
StringSource s((const byte *)in_out.constData(), in_out.size(), true, new DefaultDecryptorWithMAC(passPhrase, new StringSink(tmp)));
in_out.clear();
in_out.append(QByteArray(tmp.c_str(), tmp.size()));

}


من دربارهء کتابخانهء Crypto++ کاملا تازه کار هستم (و بطور کلی در مقولهء cryptography ) و رفرنس Crypto++ رو فقط بصورت محدود خوندم برای اینکه بتونم کارم رو راه بندازم. بنابراین ممکنه این کاربرد رو بشه با کد بهتری نوشت که اگر سراغ داشتید اطلاع بدید.

modirmasool
چهارشنبه 01 دی 1389, 13:21 عصر
eshpilen جان سلام خسته نباشی. واقعا مطالبی جالب و مفیدی رو ارائه کردین. میخواستم بدونم Visual Studio Add-in ای که در پایین سایت http://qt.nokia.com/downloads به طور مختصر درموردش توضیح داده رو اگه دانلود کنم کفایت میکنه؟ میتونیم تمام کارهامونو با اون انجام بدیم؟

Want to use Qt together with Visual Studio on Windows? Download the Visual-Studio add-in, which can be used for development together with all Qt licenses.

qt-vs-addin-1.1.7.exe (57 MB) (http://qt.nokia.com/downloads/visual-studio-add-in)


یه سری کتابخونه هم در صفحه دانلودش داره که تحت عنوان Qt libraries 4.7.1 for Windows (minGW 4.4, 319 MB) هستش. این رو هم باید دانلود کنیم یا همون Qt SDK for Windows* (322 MB) کفایت میکنه؟

ممنون

eshpilen
پنج شنبه 02 دی 1389, 20:16 عصر
شرمنده مطمئن نیستم و نسخه های اخیر Qt رو بررسی نکردم که چه تغییراتی کردن.
اما فکر میکنم اون Visual-Studio add-in به تنهایی کافی نیست و فقط باعث میشه بتونی در محیط ویژوال استودیو با کیوت کار کنی. یعنی باید کتابخانه های کیوت یا دیگر اجزاش نصب بشن. حالا اینکه دقیقا چیا و چطوری نمیدونم چون تاحالا دانلود و امتحان نکردم. بنظرم باید دانلود کنی و طبق دستورالعمل هایی که خودش میده و راهنمایی که داره روشن بشه. فکر میکنم بهتر باشه اول SDK خودش رو دانلود و نصب کنی در قدم اول، بعد Visual-Studio add-in رو نصب کنی ببینی چی میشه. احتمالا مسیر نصب کیوت رو میخواد مثلا یا خودش بصورت خودکار پیداش میکنه. اینا همه حدسه البته که امیدوارم درست باشه و کمک کنه.

درمورد libraries و SDK هم SDK رو دانلود کن. SDK کامل هست و خودش شامل کتابخانه ها (libraries) هم میشه. libraries به تنهایی برای سناریوهای خاصی هست که بدرد شما نمیخوره.

راستی نمیدونم وقتی با ویژوال استودیو میخوای کار کنی شاید باید Qt libraries 4.7.1 for Windows (VS 2008, 228 MB) (http://qt.nokia.com/downloads/windows-cpp-vs2008) رو دانلود کنی. اگر به مشکل خوردی این گزینه رو بررسی کن.

ببخشید دیگه اطلاعات بیشتر در این زمینه ندارم و اینا همش حدس هست چون خودم تاحالا این جورش رو امتحان نکردم. ضمنا خیلی وقت هم Qt کار نکردم.

راستی میتونی از فروم http://www.qtcentre.org/forum.php هم استفاده کنی برای پرسیدن اینطور سوالات. در تالار مربوطه البته (مربوط به نصب و اینها). البته به زبان انگلیسیه.

modirmasool
جمعه 03 دی 1389, 00:28 صبح
شرمنده مطمئن نیستم و نسخه های اخیر Qt رو بررسی نکردم که چه تغییراتی کردن.
اما فکر میکنم اون Visual-Studio add-in به تنهایی کافی نیست و فقط باعث میشه بتونی در محیط ویژوال استودیو با کیوت کار کنی. یعنی باید کتابخانه های کیوت یا دیگر اجزاش نصب بشن. حالا اینکه دقیقا چیا و چطوری نمیدونم چون تاحالا دانلود و امتحان نکردم. بنظرم باید دانلود کنی و طبق دستورالعمل هایی که خودش میده و راهنمایی که داره روشن بشه. فکر میکنم بهتر باشه اول SDK خودش رو دانلود و نصب کنی در قدم اول، بعد Visual-Studio add-in رو نصب کنی ببینی چی میشه. احتمالا مسیر نصب کیوت رو میخواد مثلا یا خودش بصورت خودکار پیداش میکنه. اینا همه حدسه البته که امیدوارم درست باشه و کمک کنه.

درمورد libraries و SDK هم SDK رو دانلود کن. SDK کامل هست و خودش شامل کتابخانه ها (libraries) هم میشه. libraries به تنهایی برای سناریوهای خاصی هست که بدرد شما نمیخوره.

راستی نمیدونم وقتی با ویژوال استودیو میخوای کار کنی شاید باید Qt libraries 4.7.1 for Windows (VS 2008, 228 MB) (http://qt.nokia.com/downloads/windows-cpp-vs2008) رو دانلود کنی. اگر به مشکل خوردی این گزینه رو بررسی کن.

ببخشید دیگه اطلاعات بیشتر در این زمینه ندارم و اینا همش حدس هست چون خودم تاحالا این جورش رو امتحان نکردم. ضمنا خیلی وقت هم Qt کار نکردم.

راستی میتونی از فروم http://www.qtcentre.org/forum.php هم استفاده کنی برای پرسیدن اینطور سوالات. در تالار مربوطه البته (مربوط به نصب و اینها). البته به زبان انگلیسیه.

خیلی ممنون
فقط میشه بپرسم چرا دیگه ازش استفاده نمیکنین؟

eshpilen
شنبه 04 دی 1389, 09:58 صبح
چون پروژهء نرم افزاري خاصي ندارم/نداشتم.
الان درحال يادگيري دات نت هستم.
بنده شغلم درحال حاضر ارتباط مستقيمي با برنامه نويسي نداره، اما خيلي علاقمند به برنامه نويسي هستم و عمدهء فعاليت تخصصي بنده در اين زمينه بوده و هست و براي آينده كم و بيش اين رشته رو درنظر دارم.

چون ديدم براي اينكه بتوني هر برنامه اي رو براي هر نيازي در هر محيطي بنويسي نياز به يادگيري چند زبان و فريمورك داري، رفتم دنبال يادگيري زبانها و فريمورك هاي مختلف در حيطه هاي مختلف (يعني هم وب و هم دسكتاپ). ضمنا يكي از دلايل هم اعتقاد و علاقمندي زياد به فلسفه و مزايا و آزادي نرم افزارهاي آزاد و بازمتن كه گنو/لينوكس هم جزيي از اونهاست بود كه دنبال زبانها و ابزارهاي آزاد/بازمتن رفتم. ميدونيد كه Qt بازمتن هست و يكي از فريمورك هاي اصلي برنامه نويسي اپليكيشن در گنو/لينوكس هست.

بعدا پروژه هاي مختلفي درنظر دارم كه ممكنه نياز باشن هركدوم با يك زبان و فريمورك نوشته بشن و شايد از Qt هم در يكي از اونا استفاده كردم. خب بستگي داره چي باشه و كجا بكار بره و چه خواصي مورد نياز باشه. براي هرچيزي يك شرايط و نياز و امكان انتخابهاي مختلفي هست. هيچوقت با يك زبان و فريمورك نميشه همه جا همه كار كرد (حداقل تاحالا كه نشده). حتي با چيزهاي گسترده اي مثل دات نت و جاوا. تمام مسائل كم و بيش نسبي هستن.

hamidhws
چهارشنبه 26 تیر 1392, 01:49 صبح
ضمن تشکر از توضیحاتتون .
و ببخشید که بعد از 3 سال پست میدم :دی
البته فکر کنم اون سایت که معرفی کردید دیگه برای دانلود Qt معتبر نباشه درسته ؟من یه جستجو کردم به سایت qt-project.org برخوردم و از اون الان دارم ورژن 5.1 رو دانلود میکنم((Qt 5.1.0 for Windows 64-bit (VS 2012, OpenGL, 522 MB)) با حجم 600 mb
مسیر رو درست رفتم؟
من تازه میخوام برم سمت Qt اطلاعاتم کمه توی این زمینه ممنون میشم یه توضیح بدید مثلا اونجا که زده vs 21012 منظورش چی بوده؟یعنی تحت محیط ویژوال استدیو از Qt استفاده میکنه؟

بازم تشکر از دوست خوبم eshpilen برای توضیحات خوبشون

omidshaman
چهارشنبه 26 تیر 1392, 10:33 صبح
ضمن تشکر از توضیحاتتون .
و ببخشید که بعد از 3 سال پست میدم :دی
البته فکر کنم اون سایت که معرفی کردید دیگه برای دانلود Qt معتبر نباشه درسته ؟من یه جستجو کردم به سایت qt-project.org برخوردم و از اون الان دارم ورژن 5.1 رو دانلود میکنم((Qt 5.1.0 for Windows 64-bit (VS 2012, OpenGL, 522 MB)) با حجم 600 mb
مسیر رو درست رفتم؟
من تازه میخوام برم سمت Qt اطلاعاتم کمه توی این زمینه ممنون میشم یه توضیح بدید مثلا اونجا که زده vs 21012 منظورش چی بوده؟یعنی تحت محیط ویژوال استدیو از Qt استفاده میکنه؟

بازم تشکر از دوست خوبم eshpilen برای توضیحات خوبشون
اره سایتو درست رفتی
یعنی از کامپایلر ویژوال استودیو برای ساختن برنامه استفاده می کنه اگر این ورژنو گرفتی باید visual studio 2012 هم روی سیسستمت نصب باشه