راهنمای کاربری qt

21
بریهنمای کار راQt وع به کار بای و شر آشنایع برای سرییهنمای راQt مراه آن ه به شدهی ارائهرها و ابزا

Upload: nimaweb

Post on 06-Jun-2015

242 views

Category:

Documents


4 download

DESCRIPTION

راهنمای سریع برای آشنایی و شروع به کار با qt و ابزار‌های ارائه شده به همراه آن

TRANSCRIPT

Page 1: راهنمای کاربری qt

Qtراهنمای کاربری

Qtراهنمایی سریع برای آشنایی و شروع به کار با

و ابزارهای ارائه شده به همراه آن

Page 2: راهنمای کاربری qt

فهرست مطالب

Qt........................................................................................................................3آشنایی با

3.................................................................................................................تاریخچه پیدایش

Qt3...................................................................................................................... چیست؟

Qt.........................................................................................................................3اجزاء

Qt.............................................................................................................4کتابخانههای

Qt.................................................................................................................4ابزارهای

Qt ?........................................................................................................................5چرا

5........................................................................................................قویترین گزینه موجود

5..............................................................................................................چندسکویه بودن

5..............................................................................................کاهش چرخه گسترش نرمافزار

6.....................................................................................................خصوصیات منحصر بفرد

Page 3: راهنمای کاربری qt

Qt1آشنایی با - ۱فصل

Qt - آشنایی با ۱فصل

تاریخچه پیدایش

نرمافزارهای بازمتن امروزه به صورت گسترده و در زمینههای گوناگون مورد استفاده قرار میگیرند. یکی از مهمترین مسائل

مورد استفاده در1برای تولید نرمافزارهای مناسب، ابزارهای مناسب برای این کار است. از جمله مهمترین چارچوبهای

که یک شرکت نروژی است و در سالTrolltech است. این ابزار توسط شرکت Qtگسترش نرمافزارهای بازمتن چارچوب

استKDE استفاده از آن برای تولید محیط کاربری Qt تاسیس شده است به وجود آمده است. از مهمترین کاربردهای ۱۹۹۴

تبدیل به بهترین وGTK امروزه به همراه Qtکه باعث شده است بین این دو پروژه همکاری تنگاتنگی وجود داشته باشد.

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

کمک کند.Qtشروع به کار هر چه سریعتر با

Qt ؟چیست

Qt++ یک چارچوب جامع گسترش نرمافزار برای زبان Cبودن نیز برخوردار است. این به آن2 است که از خاصیت چندسکویه

قادر خواهید بود از آن در هرQtمعنا است که شما با یک بار نوشتن هر برنامهای با استفاده از چارچوب ارائه شده توسط

با دارا بودن کتابخانهای بسیار جامع قادر است شما را درQt. 3 استفاده کنیدMac و یا Windows،Linuxیک از سکوهای

به هر کاربر مبتدی امکانQtایجاد هر نوع برنامهای در کمترین زمان یاری دهد. ابزارهای بسیار قدرتمند ارائه شده به همراه

میدهند که تولید، ترجمه و ایجاد راهنما برای نرمافزار خود را در کمترین زمان انجام دهد.

Qt اجزاء

Qt:به عنوان یک چارچوب از دو بخش تشکیل شده است

، شبکه و ...XML کلس مانند پایگاه دادهها، هسته، ۴۰۰یک کتابخانه جامع کلسها با بیش از ●

ابزارهای گسترش برای:●

و فرمها4طراحی و چیدمان رابط گرافیکی کاربر

ترجمه به زبانهای مختلف

مستندسازی

1 Framework2 Multi-platform3 Code less, create more4 GUI

Page 4: راهنمای کاربری qt

Qt2آشنایی با - ۱فصل

Qtکتابخانههای

به چندین ماژول تقسیمAPI شامل تمامی تابعهای لزم برای ایجاد نرمافزارهایی با کیفیت بال است. Qtکتابخانه کلسهای

شده است و شامل کلسهای زیر است:

5کلسهای هسته●

GUIکلسهای ●

SQLکلسهای پایگاه داده ●

XMLکلسهای ●

کلسهای شبکه●

و ...●

Qtابزارهای

Qt ابزار ستفاده میکند:۴ برای هر چه سادهتر کردن کار از

Qtطراح ●

6 با قابلیت بگیر و بندازGUIیک ابزار قدرتمند طراحی

Qtمترجم ●

Qtمجموعهای از ابزارها برای ترجمه بیدردسر و حرفهای نرمافزارهای ایجاد شده با استفاده از

Qtدستیار ●

برنامهای برای خواندن و مرور آسانتر مستندات و فایلهای راهنما

●qmake

چندسکویهmakeیک ایجادکننده فایلهای

5 Core6 Drag and drop

Page 5: راهنمای کاربری qt

Qt3آشنایی با - ۱فصل

?Qtچرا

قویترین گزینه موجود

Qtقویترین چارچوب بازمتن موجود در دنیا است. شرکتهای بسیاری از این محصول استفاده میکنند و تیم پشتیبانی بسیار

به همراه یک جامعه کاربری قوی کمک میکند تا محصولی بسیاری قوی در اختیار تمامی افراد قرارTrolltechقوی شرکت

بگیرد.

چندسکویه بودن

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

آن سکو بهره ببرید. شما در تمامی7سکوی دیگر نداشته باشید. از این گذشته شما میتوانید در هر سکویی از ظاهر بومی

سر و کار خواهید داشت و تنها لزمه داشتن کد قابل اجرا بر روی یک سکوی جدید یک بار کامپایلAPIسکوها تنها با یک

در هر یک از این سکوها استفاده کنید:Qtمجدد آن برنامه است، همین و بس. شما قادر خواهید بود از کد نوشته شده در

●Windows ۹۸ ۲۰۰۳ تا

●Mac OS X

●Linux

●Solaris, HP-UX, IRIX, AIX, BSD, TRU64 UNIX

Qt.مستقیما بر روی لیه گرافیکی سیستم عامل بومی مورد استفاده قرار میگیرد که این امر موجب سرعت بیشتر میشود

با زبانهای گوناگونC قادر است علوه بر ++8 با دارا بودن مجموعه وسیعی از رابطهای زبانهای برنامهنویسیQtاز این گذشته

PyQt و ... کار کند. به عنوان مثال شما کافی است کدهای مورد نظر خود را با استفاده از رابط Python، Javaدیگری مانند

بهIDE به عنوان Visual Studio به بعد امکان استفاده از ۴ نوشته و سپس تبدیل کنید. همچنین از نسخه Pythonبه زبان

فراهم شده است.Qtهمراه

کاهش چرخه گسترش نرمافزار

Qtبا استفاده از کتابخانه کامل و همچنین ابزارهای خود باعث میشود تا چرخه گسترش نرمافزار در بعضی از وقتگیرترین

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

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

7 Native8 Binding

Page 6: راهنمای کاربری qt

Qt4آشنایی با - ۱فصل

که باید تولید شود اختصاص میدهد.

خصوصیات منحصر بفرد

Qt:از چندین مفهوم اصلی استفاده میکند که باعث منحصر بفرد شدن آن میشوند

سکوهای مختلفGUIاستفاده کامل از ●

Qt از کنترلهای خاص خود استفاده میکند. با این روش Qtقادر است سکوهای مختلفی را شبیهسازی کند. این

وجود دارند که وابسته به سکوی مورد نظرQtامر کار را بسیار آسانتر میکند زیرا کلسهای بسیار کمی در

ناچار است دقیقا خصوصیات سکوی مورد نظر را شبیهسازی کند. البتهQtباشند. اشکال این کار در آنجاست که

سکوی بومی استفاده میکند خلفAPI اکنون از Qt شبیهسازی شده است و Qtاین نقص در آخرین نسخههای

در هر سکویی است.Qt انجام میدهد و نتیجه این امر سرعت بیشتر و ظاهر بومی SWTکاری که

9کامپایلر شیء واره●

ای روی کد Qt یاد میشود ابزاری است که باید پیش از کامپایل کردن هر کد mocاین مفهموم که از آن به عنوان

به Qtاجرا شود. این ابزار اطلعاتی در مورد کلسهای مورد استفاده در برنامه ایجاد میکند. این اطلعات توسط

10 و سیستم علمت/شکافIntrospection موجود نیستند: Cمنظور ارائه تواناییهایی به کار گرفته میشود که در ++

در مورد این قابلیتها در فصلهای بعدی توضیحات بیشتری داده خواهد شد.

از کجا باید شروع کرد؟

آشنایی دارید.Cدر تمامی این راهنما فرض ما این خواهد بود که شما با ++

است که نشانی دریافت آن را میتوانید در ضمیمه کتاب بیابید. اینQt خواندن کتاب رسمی Qtبهترین راه برای یادگیری

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

نیز در دست تهیه است.۴ میپردازد ولی کتابی برای نسخه ۳

، بدون کمک ابزارهای طراحی، برای برنامهنویسی استفاده کنید میتوانید خودآموز موجود بهCاگر قصد دارید صرفا از ++

Qtهمراه خود نرمافزار را مطالعه کنید. در صورتیکه مایلید با یک ابزار طراحی کار کنید حداقل چند فصل اول خودآموز طراح

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

و علمت و شکاف. مطالعهQtمیشود چند مبحث اساسی که دید شما را وسیعتر میسازند را نیز مطالعه کنید: مدل اشیاء

نیز میتواند مفید باشد. پس از کسب تسلط نسبی متنی که شما احتمال بیشترین زمانQtمثالهای ارائه شده و کد منبع خود

ابزار بسیار مفیدی خواهد بود.Qt خواهد بود. برای این کار دستیار APIرا به خواندن آن اختصاص خواهید داد مرجع

9 Meta object10 Signal/Slot system

Page 7: راهنمای کاربری qt

Qt5آشنایی با - ۱فصل

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

Qtفصل دوم - نصب

کار بسیار سادهای است و نیاز به مهارت خاصی ندارد ولی برای اطمینان از اینکه شما قادر خواهید بود تمامیQtنصب

را شرح خواهیم داد. مراحلQtمراحل بعدی توضیح داده شده را دنبال کنید قبل از وارد شدن به مرحله اصلی کار نصب

شرح داده میشوند.GNU/Linux و Windowsنصب بر روی دو سیستم عامل

Qt/Windowsنصب

دریافت کردهایدdist.trolltech.com را تهیه کردهاید، فایل مجوزی را که از Qt– در صورتیکه یک نسخه تجاری از ۱

شناخته شده باشد( کپی کرده و نام آن را به .userprofileدر شاخه خانگی خود )که ممکنست به عنوان متغیر محیطی

qt-license تغییر دهید. برای مثال در Windows 2003 این متغیر باید چیزی مانند ،C:\Documerts and

Settings\ username.باشد. برای نسخه بازمتن نیازی به مجوز نخواهید داشت

C:\Qt\4.1.3 در آن نصب شود از حالت فشرده خارج کنید؛ به عنوان مثال Qt– فایلها را در شاخهای که میخواهید ۲

در نام مسیر نصب مجاز نیست.11توجه: استفاده از جای خالی

– متغیرهای محیطی۳

C:\Qt\4.1.3\bin باید تغییراتی بیابد. این کار با اضافه کردن PATH، متغیر محیطی Qtبه منظور ایجاد و استفاده از

انجام میشود.PATHبه متغیر

میتواند از طریق مسیر زیر تغییر یابد :PATH، متغیر Windowsبرای نسخههای جدیدتر

Control Panel -> System -> Advanced -> Environment variables

را ویرایش کنید.C:\autoexec.batو یا در نسخههای قدیمیتر میتوانید فایل

قرار دارند. اینPATHشما همچنین ممکن است نیاز داشته باشید اطمینان یابید کامپایلر و دیگر ابزارهای ایجاد در متغیر

موضوع بستگی به محیط گسترش انتخابی شما دارد.

12 - ایجاد۴

11 Space12 Building

Page 8: راهنمای کاربری qt

Qt6نصب - فصل دوم

مراحل زیر را انجام دهید:Qtبرای تنظیم کتابخانه

C:

cd \Qt\4.1.3

configure

استفاده کنید.configure -helpبرای مشاهده فهرستی کامل از تمامی متغیرهای موجود از فرمان

را مشخصqmakeدر صورتی که چندین کامپایلر نصب کردهاید و قصد دارید از یکی از آنها استفاده کنید باید مشخصات

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

configure -platform )e.g. configure -platform win32-msvc(

مشخص کنید تا از کامپایلرconfigureدر بعضی موارد ممکنست نیاز داشته باشید محیط کامپایل را قبل از اجرا کردن

را با استفادهQt را نصب کرده باشید و بخواهید Visual Studio 2005صحیح استفاده کنید. برای مثال در صورتیکه،

کامپایل کنید باید این کار را انجام دهید. این کار معمول با انتخاب مسیر زیر انجام میشود:x64از یک کامپایلر

Start Menu >Microsoft Visual Studio 2005 | Visual Studio | <Command Prompt>

Visual Studio بستگی به سیستم مورد استفاده شما دارد. در صورتیکه بخواهید Qtفرمان مورد استفاده برای ایجاد

کتابخانهها را ایجاد کرده و تمامی مثالها،ابزارها و خودآموزها را کامپایل کند باید تایپ کنید:

nmake

در همان مسیر قبلی داشتید، اطمینان حاصل کنید تمامی اثراتQtتوجه: در صورتیکه بعدها نیاز به پیکربندی و ایجاد مجدد

configureپیکربندی قبلی از بین رفتهاند. برای این کار به مسیر مورد نظر رفته و عبارت زیر را پیش از اجرای مجدد دستور

اجرا نمایید:

make confclean

۵- Qt.نصب شده و آماده استفاده است

Qt/X11نصب

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

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

را نصب نمایید ولی در صورتی که این بستهها در توزیعQt و ..( RPM, APT, GRP, tar.gzمورد استفاده توزیع خود )

مورد استفاده شما وجود نداشتند میتوانید از روش شرح داده شده در این بخش استفاده کنید.

$ نصب کنید.HOME/.qt-license را تهیه کردهاید، فایل مجوز خود را به صورت Qt– در صورتیکه یک نسخه تجاری از ۱

Page 9: راهنمای کاربری qt

Qt7نصب - فصل دوم

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

زیر را دریافت کردهاید با استفاده از– فایل را از حالت فشرده خارج کنید. برای این کار به عنوان مثال در صورتیکه بسته ۲

دستورات زیر این کار را انجام دهید:

qt-x11-opensource-desktop-4.1.3.tar.gz

cd /tmp

gunzip qt-x11-opensource-desktop-4.1.3.tar.gz # uncompress the archive

tar xvf qt-x11-opensource-desktop-4.1.3.tar # unpack it

/ که محتوی فایلهای فشرده شده است را ایجاد میکند.tmp/qt-x11-opensource-desktop-4.1.3این دستورات شاخه

– ایجاد۳

بر روی دستگاه خود از دستور زیر استفاده کنید:Qtبرای پیکربندی کتابخانه

cd /tmp/qt-x11-opensource-desktop-4.1.3

./configure

در صورتیکه نیاز به اطلعات بیشتر در مورد گزینههای موجود دارید از دستور زیر استفاده کنید:

./configure -help

Qt به صورت پیش فرض برای نصب در مسیر usr/local/Trolltech/Qt-4.1.3پیکربندی شده است ولی میتوان مسیر

- تغییر داد.prefixنصب را با استفاده از پارامتر

برای ایجاد کتابخانه و کامپایل کردن تمامی مثالها، ابزارها و خودآموزها تایپ کنید:

make

برای نصب کتابخانه، مثالها، ابزارها و تمامی خودآموزها از این دستور استفاده کنید:

su -c make install“ ”

و کلمه عبور کاربر ریشه را وارد کنید.

.gmake نام دیگری دارد، مانند makeتوجه داشته باشید که در بعضی از سیستمها ابزار

در همان مسیر قبلی داشتید، اطمینان حاصل کنید تمامی اثراتQtتوجه: در صورتیکه بعدها نیاز به پیکربندی و ایجاد مجدد

configureپیکربندی قبلی از بین رفتهاند. برای این کار به مسیر مورد نظر رفته و عبارت زیر را پیش از اجرای مجدد دستور

اجرا نمایید:

Page 10: راهنمای کاربری qt

Qt8نصب - فصل دوم

make confclean

– متغیرهای محیطی۴

استفاده کرد.PATH، باید از بعضی متغیرهای محیطی مانند Qtبه منظور استفاده از

و ... استفاده میکنید( عبارت زیر را اضافه کنید:bahs، sh. )در صورتیکه از پوسته profileبرای این کار ابتدا در فایل

PATH=/usr/local/Trolltech/Qt-4.1.3/bin:$PATH

Page 11: راهنمای کاربری qt

Qt9نصب - فصل دوم

در صورتیکه از است( عبارت زیر را اضافه کنید: tcsh یا csh. )در صورتیکه پوسته مورد استفاده شما loginهمچنین در فایل سازگاری داشته باشد. در موردQtپوستهای متفاوت استفاده میکنید، متغیرهای محیطی خود را به گونهای تغییر دهید که با

را به گونهای تغییرLD_LIBRARY_PATH پشتیبانی نمیکنند شما همچنین باید متغیر محیطی rpathکامپایلرهایی که از استفادهGCC/ در آن گنجانده شود. در صورتی که لینوکس شما از usr/local/Trolltech/Qt-4.1.3/libدهید که مسیر

میکند نیازی به این گام نیست.

نصب شده و آماده استفاده است.Qt– اکنون ۵

Page 12: راهنمای کاربری qt

10شکاف/مفهوم علمت- فصل سوم

فصل سوم - مفهوم علمت/شکاف

Qtمقدمه - مدل شیگرائی

ی آن در بعضی حیطههای13 پشتیبانی بسیار خوبی از مفهوم شیگرائی ارائه میکند. ولی ماهیت ایستاCمدل شیگرائی ++

زمینهای است که نیاز همزمان به کارآیی از نظر زمان14خاص بسیار انعطافناپذیر است. برنامهنویسی رابط گرافیکی کاربر

اینQt با انعطافپذیری مدل شیگرائی C با ترکیب کردن سرعت ++Qt و همچنین سطحی بال از انعطافپذیری دارد. 15اجرا

قابلیت را ارائه میکند.

Qt++ قابلیتهای زیر را به C:اضافه میکند

یک سازوکار بسیار قوی برای ارتباط آسان بین اشیاء به نام علمت/شکاف●

تعریف خواص اشیاء به صورتی که قابل طراحی و کاوش باشند●

فیلترهای قدرتمند برای رویدادها●

ترجمه رشتهها با توجه به متن به منظور پشتیبانی از زبانهای مختلف●

به صورت سلسله مراتبی که مالکیت اشیاء را مدیریت میکند16درخت اشیاء●

( که هنگامی که شی مورد نظر آنها نابود شود مقدارشان به صفر تغییرQpointerنشانگرهای حفاظت شده )●

که وقتی چنین اتفاقی بیفتد سرگردان باقی میمانندCمییابد، بر خلف نشانگرهای خود ++

پیادهسازی شدهاند.Qobject با استفاده از 17 و بر مبنای وراثتCبسیاری از این قابلیتها با استفاده از تکنیکهای استاندارد ++

در این فصل قصد داریم مهمترین این سازوکارها یعنی سیستم علمت/شکاف را بررسی نماییم. این قابلیت شاید مهمترین

را از دیگر ابزارهای مشابه آن متمایز میکند.Qtقابلیتی باشد که

سیستم علمت/شکاف چیست؟

دیگر از این تغییرات آگاهwidget را تغییر میدهیم معمول میخواهیم که یک widget، هنگامی که یک GUدر برنامهنویس

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

آن پنجره صدا زده شود.close پنجرهای کلیک کند، احتمال میخواهیم که تابع )(Closeدر صورتی که کاربر بر روی دکمه

بهره میبرند. یک فراخوانی یک نشانگر برای یک تابع است، بنابراین در19 برای این کار از فراخوانی18سایر جعبه ابزارها

13 Static14 Graphical user interface programming15 Runtime16 Object tree17 Inheritance18 toolkit19 Callback

Page 13: راهنمای کاربری qt

11شکاف/مفهوم علمت- فصل سوم

صورتی که بخواهید یک تابع پردازشگر شما را از رویدادی خاص مطلع کند، نشانگری به تابعی دیگر را به آن تابع پردازشگر

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

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

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

باید صدا بزند.

ما یک روش فراخوانی جایگزین داریم، علمتها و شکافها. هنگامی که رویداد خاصی رخ دهد یک علمت ایجاد میشود.Qtدر

widget های استفاده شده در Qtعلمتهای از پیش تعریف شده بسیاری دارند ولی ما همیشه میتوانیم سیگنالهای خاص خود

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

ها به صورت زیرکلس استفاده کرده وwidgetشکافهای از پیش تعریف شده بسیاری دارند ولی ما همچنین قادر هستیم از

شکافهای خاص خود را تعریف کنیم تا قادر باشیم علمتهای خاص مورد علقه خود را کنترل کنیم.

20 Subclass

Page 14: راهنمای کاربری qt

12شکاف/مفهوم علمت- فصل سوم

یک علمت باید با شناسه شکافی که آن را دریافت میکند همخوانی داشته باشد )در واقع یک شکاف ممکن است21شناسه

شناسهای کوتاهتر از علمتی که دریافت میکند داشته باشد زیرا میتواند از آرگومانهای اضافی چشمپوشی کند(. از آنجایی که

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

ندارند، کلسی که علمت خاصی را تولید میکند نه میداند و نه برایش اهمیتی دارد که کدام شکافها علمت را دریافت

به ما اطمینان میدهد در صورتی که علمتی را به یک شکاف متصل کنیم، شکاف در زمانQtمیکنند. سازوکار علمت در

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

( میتوانند از علمت و شکاف استفاده کنند.Qwidget یا یکی از زیرکلسهای آن ارث میبرند )مانند Qobjectتمامی که از

علمتها هنگامی توسط اشیاء منتشر میشوند که حالت آنها به گونهای تغییر یابد که برای دیگر اشیاء جالب باشد. این تنها کاری

است که یک شیء برای ارتباط انجام میدهد. برای شیء اهمیتی ندارد که شیء دیگری این علمت را دریافت میکند یا خیر.

یاد میشود و به ما اطمینان میدهد که شیء میتواند22این واقعا همان چیزی است که از آن به عنوان کپسولسازی اطلعات

به کار رود.23به عنوان یک جزء نرمافزاری

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

نمیداند که چیزی علمتهای فرستاده شده توسط آن را دریافت میکند، یک شکاف نیز نمیداند که آیا هیچ علمتی به آن

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

شما میتوانید هر چند علمت که بخواهید به یک شکاف متصل کنید و یک علمت نیز میتواند به هر چند شکاف که لزم باشد

متصل شود. حتی ممکنست که یک علمت را به علمتی دیگر متصل کنیم. این امر باعث میشود یک علمت به محض دریافت

علمت قبلی منتشر شود.

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

علمتها

علمتها هنگامی توسط یک شی منتشر میشوند که حالت درونی آن تغییر کرده باشد به گونهای که این تغییر ممکن باشد برای

دیگر اشیاء جالب باشد. تنها کلسی که علمت و زیرکلسهای آن را تعریف کرده است قادر است علمت را منتشر کند.

هنگامی که یک علمت منتشر میشود، شکافهای متصل به آن به سرعت مانند یک صدا زدن ساده تابع اجرا میشوند. هنگامی

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

استفاده24 قرار دارد به محض بازگشت تمامی شکافها روی میدهد. در صورتی که از اتصالهای صفبندی شدهemitعبارت

قرار دارد به اجرا ادامه میدهد و شکافها بعدا اجرا میشوند.emitشود کدی که پس از

21 Signature22 Information encapsulation23 Software component24 Queued connection

Page 15: راهنمای کاربری qt

13شکاف/مفهوم علمت- فصل سوم

در صورتی که چندین شکاف به یک علمت متصل شده باشند، شکافها پس از دریافت علمت، یکی پس از دیگری، با ترتیبی

اتفاقی اجرا میشوند.

. پیادهسازی شوند. آنها هرگز نمیتوانند از نوع برگشتی باشندcpp ایجاد میشوند و نباید در فایل mocعلمتها عموما توسط

(.void)مانند استفاده از

نکتهای در مورد آرگومانها: تجربه نشان داده است که شکافها و علمتها در صورتی که از نوع خاصی استفاده نکنند بیشتر قابل

استفاده مجدد هستند.

شکافها

هستند وCیک شکاف هنگامی صدا زده میشود که علمتی که به آن متصل شده است منتشر شود. شکافها توابع عادی ++

میتوانند به صورت عادی فراخوانی شوند؛ تنها تفاوت اصلی آنها در این است که علمتها میتوانند به آنها متصل شوند.

آرگومانهای یک شکاف نمیتوانند مقادیر پیشفرض داشته باشند و، مانند علمتها، بهتر است به جز موارد ضروری از انواع

خاص مورد استفاده خود برای آرگومانهای شکافها استفاده نکنید.

از آنجا که شکافها تابعهای عادی با تفاوتهای کوچک هستند، مجوزهای دسترسیای مانند دیگر تابعهای عادی دارند. مجوز

دسترسی یک شکاف تعیین میکند که چه کسی میتواند به آن متصل شود:

شامل شکافهایی است که هر کسی میتواند علمتها را به آنها متصل کند. این موضوع برایpublic slotsبخش ●

برنامهنویسی شیءگرا بسیار مفید است؛ شما میتوانید اشیائی ایجاد کنید که هیچ چیز در مورد یکدیگر نمیدانند،

علمتها و شکافهای آنها را متصل کنید تا اطلعات به درستی منتقل شوند و مانند یک قطار اسباببازی آن را به

حال خود بگذارید تا مسیر خود را طی کند.

شامل شکافهایی است که این کلس و زیرکلسهایش مجازند علمتها را به آنها متصلprotected slotsبخش ●

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

خارج.

شامل شکافهایی است که تنها خود کلس میتواند علمتها را به آنها متصل کند. این بخشprivate slotsبخش ●

مربوط به کلسهایی که شدیدا با یکدیگر مرتبط هستند، که نمیتوان اطمینان داشت حتی زیرکلسها نیز ارتباطها

را به درستی دریافت کنند.

همچنین میتوان شکافها را مجازی تعریف کرد که در عمل بسیار مفید است.

در مقایسه با فراخوان، روش شکاف و علمت، به دلیل انعطافپذیری بیشتری که ارائه میکند، از سرعت کمتری برخوردار

است گرچه این موضوع در عمل بسیار نامحسوس است. به طور کلی، منتشر کردن یک علمت که به چند شکاف متصل است

Page 16: راهنمای کاربری qt

14شکاف/مفهوم علمت- فصل سوم

، کندتر است. این سرباره زمانیای است که برای25 بار از صدا زدن مستقیم دریافتکننده، با صدا زدن غیرمجازی۱۰تقریبا

مشخص کردن موقعیت شی مورد اتصال، شبیهسازی، بازسازی ایمن تمامی ارتباطات )مانند چک کردن این موضوع که

بار صدا۱۰دریافتکنندهها در طی انتشار نابود نشدهاند( و مرتبسازی هرگونه پارامتر با روشی کلی لزم است. با وجودی که

زدن یک تابع غیرمجازی ممکنست بسیار زیاد به نظر برسد، این زمان بسیار کمتر از سربارهای است که هرگونه عملیاتی مانند

new یا delete دارد. به محض آنکه یک عملیات بر روی رشته، بردار یا فهرست انجام دهید که در پشت صحنه نیاز به new

دارد، سرباره شکاف و علمت نقشی بسیار کوچک در کل هزینههای صدا زدن تابع خواهند داشت.deleteیا

تابع را صدا۱۰همین موضوع هنگامی که شما در یک شکاف یک صدا زدن سیستم داشته باشید یا به طور غیرمستقیم بیش از

علمت متصل به یک گیرنده۲,۰۰۰,۰۰۰ شما میتوانید در هر ثانیه 500 با سرعت i586بزنید اتفاق میفتد. بر روی یک دستگاه

علمت متصل به دو گیرنده ارسال کنید. این سادگی و انعطافپذیری سازوکار علمت و شکاف کامل ارزش۱,۲۰۰,۰۰۰یا حدود

سرباره ایجادشده که کاربر متوجه آن نخواهد شد را دارد.

تولید میکنند ممکنست باعث خطاها وslot یا signalتوجه داشته باشید که سایر کتابخانههایی که متغیرهایی با عنوان

#undef شوند. برای حل این مشکل، از علمت Qtهشدارهای کامپایلر در هنگام کامپایل شدن به همراه یک برنامه مبتنی بر

استفاده کنید.

26اطلعات ابرشیء

ای را تولید میکند که یک ابرشیءC را تجزیه و تحلیل کرده و کد ++C( کلس تعریف شده در فایل ++mocکامپایلر ابرشیء )

را ایجاد میکند. ابرشیء شامل نامهای تمامی اعضای شکاف و علمت و همچنین نشانگرهای این تابعها است.

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

ارث میبرد یا خیر برای مثال:

if )widget->inherits)"QAbstractButton"(( {

QAbstractButton *button = static_cast<QAbstractButton*>)widget(;

button->toggle)(;

}

25 Non-virtual call26 Meta-object

Page 17: راهنمای کاربری qt

15شکاف/مفهوم علمت- فصل سوم

–فصل چهارم کلسهای چیدمان های فرزند ارائه میکند.widget روشی ساده و قدرتمند برای مشخص کردن چیدمان Qt 27سیستم چیدمان

با یک بار مشخص کردن چیدمان منطقی، شما میتوانید از مزایای زیر استفاده کنید:

های فرزندwidgetقرارگیری ●

ابعاد قابل قبول پیشفرض پنجرهها●

کنترل تغییر اندازه ●

بهروزسازی خودکار در صورت تغییر محتویات:●

فرزندwidgetاندازه قلم، متن یا دیگر محتویات

فرزندwidgetنمایش دادن یا پنهان کردن یک

فرزندwidgetمحو کردن

و28اشکال کدهای چیدمان دستنویس آن است که در زمانی که در حال طراحی یک فرم هستید و باید چرخه کامپایل، اتصال

که تجربه کردن باGUI 29 است، یک ابزار طراحی دیداریQtاجرا را طی کنید استفاده از آن راحت نیست. راه حل ما طراح

را برای شما تولید میکند.چیدمان Cچیدمانها را آسان کرده و کد ++

برای کدهای دستنویس طراحی شدهاند در نتیجه فهم و استفاده از آنها راحت است. مولد کد فرمهایQtکلسهای چیدمان

نیز از کلسهای چیدمان استفاده میکند.Qtایجاد شده توسط طراح

30چیدمانهای افقی، عمودی و شبکهای

،QHBoxLayout ها استفاده از یک مدیر چیدمان است: widgetسادهترین راه برای ایجاد یک چیدمان خوب برای

QVBoxLayout و QgridLayout این کلسها از .Qlayout ارث میبرند که به نوبه خود از Qobject و نه( Qwidget)

ها را مدیریت میکنند. برای ایجاد چیدمانهای پیچیدهتر، شماwidgetارث میبرد. آنها مدیریت چیدمان مجموعهای از

میتوانید یک مدیر چیدمان را در دیگری جای دهید.

را به صورت افقی در یک ردیف از چپ به راست )یا برای زبانهایwidget چندین QHBoxLayoutیک ●

راست به چپ، از راست به چپ( میچیند.

27 Layout28 Link29 Visual30 Grid

Page 18: راهنمای کاربری qt

16–فصل چهارم کلسهای چیدمان

را در یک ستون عمودی، از پایین تا بال میچیند.widget چندین QVBoxLayoutیک ●

های میتوانند چندین سلول راwidget را در یک شبکه دوبعدی میچیند. widget چندین QGridLayoutیک ●

اشعال کنند.

در اولین شکل بال را مدیریت میکند:QPushButton ای را ایجاد میکند که پنجQHBoxLayoutاین کد

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton)"One"(; QPushButton *button2 = new QPushButton)"Two"(; QPushButton *button3 = new QPushButton)"Three"(; QPushButton *button4 = new QPushButton)"Four"(; QPushButton *button5 = new QPushButton)"Five"(;

QHBoxLayout *layout = new QHBoxLayout; layout->addWidget)button1(; layout->addWidget)button2(; layout->addWidget)button3(; layout->addWidget)button4(; layout->addWidget)button5(;

window->setLayout)layout(; window->show)(;

نیز حالتی مشابه دارد به جز خطی که چیدمان در آن تولید شده است. کد ایجاد شده برایQVBoxLayoutکد

QGridLayout تا حدودی متفاوت است زیرا باید موقعیت ردیفها و ستونهای widget:فرزند را مشخص کنیم

Page 19: راهنمای کاربری qt

17–فصل چهارم کلسهای چیدمان

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton)"One"(; QPushButton *button2 = new QPushButton)"Two"(; QPushButton *button3 = new QPushButton)"Three"(; QPushButton *button4 = new QPushButton)"Four"(; QPushButton *button5 = new QPushButton)"Five"(;

QGridLayout *layout = new QGridLayout; layout->addWidget)button1, 0, 0(; layout->addWidget)button2, 0, 1(; layout->addWidget)button3, 1, 0, 1, 2(; layout->addWidget)button4, 2, 0(; layout->addWidget)button5, 2, 1(;

window->setLayout)layout(; window->show)(;

به عنوان چهارمین آرگومان۲ دو ستون را اشغال میکند. این کار با مشخص کردن QpushButtonسومین

QgridLayout::addWidget.ممکن است

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

یwidget مشخص میکند تا آنها تبدیل به فرزند QWidget::seParent ها را با استفاده از )(widgetصورت خودکار والد

شوند که روی آن نصب شدهاند.

ای هستند که چیدمان بر روی آن نصب شده است، نه خود چیدمان. تنهاwidget های یک چیدمان فرزندان widgetتوجه:

widget ها مجاز هستند والدwidget.های دیگر باشند و نه چیدمانها

یک چیدمان را در چیدمانی دیگر قرار تعبیه کنید که در این صورت چیدمان داخلیaddLayoutشما میتوانید با استفاده از )(

فرزند چیدمانی میشود که در آن تعبیه شده است.

ها به چیدمانwidgetاضافه کردن

ها را به چیدمان اضافه میکنید، فرآیند چیدمان به این صورت عمل میکند:widgetهنگامیکه

به خود اختصاص میدهند.QWidget::sizePolicy های در ابتدا مقداری فضا مطابق با )(widget– تمامی ۱

با مقداری بیش از صفر داشته باشند، فضایی متناسب با این متغیر31 ها یک متغیر گسترشwidget در صورتیکه هر یک از -۲

به آنها اختصاص داده میشود.

تنها در صورتی فضای بیشتری خواهدwidget ها صفر باشد آن widget در صورتیکه مقدار متغیر گسترش هر یک از -۳

ایwidget های موجود، فضای در دسترس ابتدا به widget دیگری از آن فضا استفاده نکند. از بین widgetداشت که هیچ

داشته باشد.Expandingتعلق میگیرد که خاصیت

31 Stretch factor

Page 20: راهنمای کاربری qt

18–فصل چهارم کلسهای چیدمان

ها فضایی کمتر از حداقل اندازه آنها اختصاص داده شود به آنها به میزان حداقلwidget– در صورتیکه به هر یک از ۴

دارای حداقل اندازه نباشد متغیر گسترش تعیینکننده اندازهwidgetفضای مورد نیاز اختصاص داده خواهد شد. در صورتیکه

آن خواهد بود.

ای که فضایی بیش از حداکثر اندازه خود اشغال کرده باشد حداکثر فضای مجاز تخصیص دادهwidget– به هر گونه ۵

دارای حداکثر اندازه نباشد متغیر گسترش تعیینکننده اندازه آن خواهد بود.widgetمیشود. در صورتیکه

متغیر گسترش

widget ها معمول بدون تنظیم کردن متغیر گسترش ایجاد میشوند. هنگامی کهwidgetها در یک چیدمان قرار گیرند سهمی یا حداقل اندازه خود )هر یک که بزرگتر باشد( اشغال میکنند. متغیر گسترشQWidget::sizePolicyاز فضا را مطابق با )(

ها نسبت به یکدیگر اشغال میکنند به کار میرود.widgetبرای تغییر میزان فضایی که

چیده شده باشند بدون آنکه متغیر گسترشی برایQHBoxLayout داشته باشیم که با استفاده widgetدر صورتی که سه آنها تعیین کرده باشیم چنین چیدمانی خواهیم داشت:

در صورتیکه به متغیر گسترش مقدار بدهیم آنها به نسبت اندازههای مختلفی پیدا خواهند کرد )که از حداقل اندازه آنها بیشتر

است(:

چیدمان دستی

های سفارشی نیز استفاده کنید.کافی است )(widgetدر صورتیکه از نوعی چیدمان سفارشی استفاده میکنید میتوانید از QWidget::resizeEvent)( را برای محاسبه فضای مورد نیاز استفاده کرده و در برای هر فرزند setGeometry.را صدا بزنید

widget در زمانی که چیدمان نیاز به محاسبه مجدد داشته باشد رویدادی از نوع Qevent::LayoutHint.به خود میگیرد را مجددا پیادهسازی کنید.QWidget::event کافی است )(QEvent::LayoutHintبرای کنترل رویدادهای

نوشتن مدیرهای چیدمان سفارشی

است. برایQLayoutیک روش جایگزین برای چیدمان دستی، نوشتن یک مدیر چیدمان با استفاده از نوشتن زیرکلس برای نوشتن کلس چیدمان خاص خود باید موارد زیر را تعریف کنید:

است.QLayoutItemیک ساختار داده برای ذخیره موارد کنترل شده توسط چیدمان. هر مورد یک ●

●)(addItemچگونه موارد را به چیدمان اضافه کنیم ،

●)(setGeometryچگونه چیدمان را انجام دهیم ،

●)(sizeHintاندازه مطلوب چیدمان ،

●)(itemAtچگونه موارد موجود در چیدمان را تکثیر کنیم ،

●)(takeAtچگونه موارد را از چیدمان حذف کنیم ،

Page 21: راهنمای کاربری qt

19–فصل چهارم کلسهای چیدمان

را نیز پیاده کنید.minimumSizeدر اکثر موارد شما باید )(

دیگر نکات

چیدمان نسبت ارتفاع و عرض را کنترل نمیکند.

های مخفی مانندwidget چشمپوشی میکنیم، این به آن معناست که چیدمان با QLayoutItem::isEmptyما از )(

widget.قابل دید برخورد میکند