لطفا وارد شوید یا ثبت‌نام کنید تا به انجمن‌ها دسترسی کامل داشته باشید.



 
امتياز موضوع :
  • 0 رأي - معدل امتيازات : 0
  • 1
  • 2
  • 3
  • 4
  • 5
آشنایی مقدماتی و نکات کاربردی Qt
2009-09-22, 06:28 PM,
ارسال : #21
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:29 PM,
ارسال : #22
 
ما تابع 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!");


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:30 PM,
ارسال : #23
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:31 PM,
ارسال : #24
 
باید یک نکته ای رو بگم که نسبتا مهمه.
متاسفانه در نسخهء اپن سورس کیوت که دانلود میکنیم، پشتیبانی از فریمورک پخش مالتی مدیا بنام phonon فعال نیست.
نسخهء اپن سورس کیوت همراه با کامپایلر mingw ارایه میشه و گفته شده که اشکال در کامپایل بخشهای مربوط به phonon با این کامپایلر وجود داره.
البته من مدتی هست دارم تلاش میکنم تا از روشهای غیررسمی و آزمایشی و با کامپایل مجدد کیوت با mingw، این قابلیت رو فعال کنم. گفته شده راههایی برای این مشکل وجود داره و ظاهرا افرادی هم موفق به اینکار شدن که مقالاتش در نت موجوده، اما بهرحال برای منکه اشکال پیش آمد و یکسره موفق نشدم و چون اینطور کارها کار افراد مبتدی هم نیست، تا زمانیکه شخصا موفق و مطمئن نشدم نمیتونم قول بدم و راهنمای خاصی رو برای اضافه کردن این قابلیت ارایه کنم. اما به محض موفقیت سعی در اینکار خواهم کرد و قصد دارم یک راهنمای گام به گام بنویسم که همهء افراد بتونن از روی اون با موفقیت عملیات لازم رو انجام بدن.

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

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

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

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


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:31 PM,
ارسال : #25
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:32 PM,
ارسال : #26
 
مدتیست هر روز به هر دری زدم، با مسئولان رسمی خود کیوت مکاتبه کردم، توی اینترنت سرچ کردم، مدت زیادی توی یک فروم انگلیسی زبان داشتم سر و کله میزدم، حداقل بیش از ده بار کیوت رو روی سیستم نصب و کامپایل مجدد کردم. هر کامپایل حداقل حدود 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/67...mingw.html

http://rapidshare.com/files/260156018/ph...tmingw.zip

http://flashqard-project.org/uploads/fol...tmingw.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 برای ساخت برنامه های خودتون استفاده کنید.


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:32 PM,
ارسال : #27
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:33 PM,
ارسال : #28
 
برای ساده ترین حالت پخش صوت و با فرمت 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 بهش دسترسی مستقیم داریم).


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:33 PM,
ارسال : #29
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:34 PM,
ارسال : #30
 
میشه گفت کیوت سه روش برای ایجاد تایمر داره؛ 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 هم در دسترس برنامه نویسان هست و بدون مشکل کار میکنه و ضمنا همونطور که اشاره کردم مزایایی داره و در شرایط خاصی میتونه مناسبتر باشه.
توجه داشته باشید که ما از این روشهای دیگر استفاده نمیکنیم چون سبکتر و سریعتر هستن، چون این مقادیر در برنامه های برنامه نویسان اونقدری ناچیز هستن که بحساب نمیان و یک کد منعطف و خوانا خیلی بهتر از کم کردن منابع مصرفی برنامه به مقدار ناچیز هست؛ اما ما از اونها در ساده تر کردن و سریعتر کردن کدنویسی و ساخت برنامه های خیلی کوچک یا آزمایشی و یا شرایط خاص دیگر استفاده میکنیم، چون وقت و انرژی برنامه نویس حرفه ای از منابع بسیار ارزشمند محسوب میشن. البته اینها نظر و توجیه بنده برای استفاده از این روشهای نه چندان استاندارد هست!


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:34 PM,
ارسال : #31
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:34 PM,
ارسال : #32
 
این یک برنامهء کوچکه که با Qt نوشته شده.
یک بازی ساده هست که در بخش خودآموز کیوت بعنوان مثال آورده شده بود؛ اما ویژگیهای متعددی رو که بعضی از اونها بعنوان تمرین مطرح شده بودن بهش اضافه کردم.
شاید بتونه بعنوان یک نمونه، قابلیت ها و انعطاف کیوت و همچنین رابطهء اونها با حجم کد رو نشون بده. از امکانات متنوعی از کیوت درش استفاده شده که باعث میشه مثال کوچک خوبی بنظر برسه.

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

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

ویرایش: بستهء کد منبع، ضمیمه این پست نیز شد.


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:35 PM,
ارسال : #33
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:35 PM,
ارسال : #34
 
حتما تابحال برنامه هایی رو دیدید که موقعی که میخوایم سیستم رو 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();
}


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:35 PM,
ارسال : #35
 
...


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-22, 06:42 PM,
ارسال : #36
 
من با درج پست آخر مشکل دارم و باز پیام زیر رو میده:
[ltr]
Method Not Implemented

POST to /html/index.php not supported.
[/ltr]
این مشکل با پستهایی که حاوی کد بودن در گذشته هم بارها پیش آمده بود. ظاهرا به کلمات خاصی حساس هست و مربوط به تدابیر ماجول امنیتی میشه (خیلی ضایس!!).
پس لطفا مدیر محترم اگر میتونن زحمت بکشن این پست رو به تاپیک اضافه کنن: <!-- m --><a class="postlink" href="http://iranclubs.org/forums/showpost.php?p=1122875&postcount=42">http://iranclubs.org/forums/showpost.ph ... stcount=42</a><!-- m -->


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-23, 08:17 PM,
ارسال : #37
 
چی شد بابا یخورده کمک کنید دیگه!
حداقل مشکل پست بالا رو درست کنید.
ضمنا من اینهمه زحمت کشیدم روی ایجاد این مطالب اما هیچ کجا کسی تحویل نگرفت.
انگار کسی اصلا دیگه برنامه نویسی نمیکنه، یا شایدم سوپرحرفه ای هستن و اینا بدردشون نمیخوره!!
یعنی حداقل توی فروم گنو/لینوکس کسی پیدا نمیشه Qt کار کنه یا علاقه ای داشته باشه؟!
این تاپیک رو هم اینجا نذاشتم فقط واسه نگا کردن. اگر خودتون هم مطلب و تجربهء خوبی دارید در این تاپیک درج کنید و کار منو هم کمتر کنید.
مثلا اون مورد آیکون فایل اجرایی برنامه رو که یکبار پرسیدم و یک نفر در این فروم جواب داد، اما هنوز خودم وقت نکردم تستش کنم. راستی منبعش رو هم درج کنید.

فقط وقت کنم یخورده روی استفاده از فایلهای اینترفیس تولید شده در حالت ویژوال هم توضیح بدم خیلی خوب میشه و مطالب تقریبا کامله (هدف این تاپیک آموزش کلی نیست و هدف آشنایی و نکات و موارد کاربردی مهم بوده).


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-25, 03:00 AM,
ارسال : #38
 
سپاسگزارم فلانی جان، خلا این مطالب در تکنوتاکس احساس می شد. انشاالله کمکت می کنیم در بهتر شدن این جا! Wink
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-09-25, 11:52 AM,
ارسال : #39
 
قربون مرامت آنارشیست عزیز!

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

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

در اینجا میخوایم برای اینکه مطالب مقدماتی کیوت کامل باشن کمی هم درمورد استفاده از رابط های کاربری ای که بصورت ویژوال طراحی شدن صحبت کنیم. این رابطها با نرم افزار 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
نقل قول این ارسال در یک پاسخ
2009-09-25, 01:43 PM,
ارسال : #40
 
والا من اتفاقا دنبال همچین مطلبی میگشتم که متاسفانه پیدا نمیکردم. خیلی ممنون!
فقط یک انتقاد خیلی طولانی مینویسی!

Hey you, dont help them to bury the light
Don't give in without a fight.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ


رفتن به انجمن :


کاربران در حال مشاهده موضوع : 1 مهمان