صفحه 1 از 2 12 آخرآخر
نمایش نتایج 1 تا 40 از 54

نام تاپیک: معرفی و آموزش C++‎‎‎/Qt به صورت گام به گام

  1. #1

    Post معرفی و آموزش C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎/Qt به صورت گام به گام


    با سلام خدمت دوستان و مدیران تالار؛




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

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

    1. مقدمات و معرفی Qt برای شروع کار
    2. راهنمایی برای دانلود مناسبترین نسخه از Qt
    3. معرفی و کار با Signal و Slot ها و Event ها
    4. معرفی و کار با نمایش Windows
    5. معرفی و کار با لایه ها زبانه ها و بدنه های در طراحی
    6. معرفی و کار با قابلیت های HTML و CSS در طراحی
    7. معرفی و کار با لایه های افقی و عمودی
    8. معرفی و کار با لایه های Grid در طراحی فرم
    9. معرفی و کار با جدا کننده ها Splitter
    10. معرفی و کار با دایرکتوری ها
    11. معرفی و کار با فایل ها / خواندن و نوشتن در آن ها
    12. معرفی و کار با برچسب ها Label
    13. معرفی و کار با دکمه ها Button
    14. معرفی و کار با کنترل ورودی LineEdit
    15. معرفی و کار با چک باکس CheckBox
    16. معرفی و کار با RadioButton
    17. معرفی و کار با Combobox
    18. معرفی و کار با لیست ها / ListWidget
    19. معرفی و کار با لیست های درختی / TreeWidget
    20. معرفی و کار با Action ها
    21. معرفی و کار با Slider و Progress ها
    22. معرفی و کار با Statusbar در فرم
    23. معرفی و کار با MessageBox
    24. معرفی و کار با Timer
    25. معرفی و کار با Thread ها
    26. معرفی و کار با Map
    27. معرفی و کار با Hash
    28. معرفی و کار با QStringList/ لیست رشته ای
    29. معرفی و کار با الگوریتم های مرتب سازی
    30. معرفی و کار با الگوریتم های جستجو
    31. معرفی و کار با Tooltip ها همراه با قابلیت های ویژه
    32. معرفی و کار شبکه / دانلود فایل بر اساس پروتکل های HTTP و FTP
    33. معرفی و کار با باینری و سریالیز کردن آبجکت ها
    34. معرفی و کار با TextStream ها
    35. مقایسه انواع حالت های کامپایل در Qt
    36. نحوه افزودن دیگر کتابخانه های C++‎‎‎‎‎‎‎‎ در محیط Qt Creator و استفاده همراه با کتابخانه Qt
    37. در حال بررسی موارد مناسب و هماهنگ با Qt 5.3 برای آموزش


    و اگه خدا بخواد بعد از به اتمام رسوندن این موارد میریم روی مباحث حرفه ای تر تا اطلاعات جامع تری در این رابطه در اختیار دوستان قرار بدیم.

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

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

    نسخه Qt برای این آموزش خواهد بود : Qt 5.3 با کامپایلر MinGW و MSVC2012.
    همچنین آموزش های لازم برای ارتباط برقرار کردن دو محیط قدرتمند زبان C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ یعنی Qt و Visual Studio 2012 و 2013 : در این لینک

    سیستم عامل مناسب : لینوکس Ubuntu و ویندوز 7 و 8

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


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


    پیام خصوصی برای حل و فصل موارد به جز نظرات و پیشنهادات ندین چون واقعا وقت نخواهم کرد جواب بدم.
    آخرین ویرایش به وسیله کامبیز اسدزاده : یک شنبه 17 تیر 1397 در 17:06 عصر دلیل: به روز رسانی به Qt 5.3.1

  2. #2

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    خب مرحله 1 : مقدمات و معرفی Qt برای شروع کار :

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

    همانطور که می دانید امروزه توسعه نرم افزار و به روز رسانی های آن در انواع پلتفرم ها از قبیل Linux , Windows , Mac OS X و همچنین پلتفرم های موبایلی و تبلتی از قبیل Andoird , IOS , Backberry و ... با سرعت بسیار زیادی دنبال می شود ؛ همچنین آرزوی اکثر برنامه نویسان این است که یک زبان ویژه با تمامی قابلیت ها و مهمتر از همه پشتیبانی از Objective Oriented و Performance بالا رو همراه با یک IDE همه کاره و جذاب در اختیار داشته باشند که در این صورت به جای تجربه کردن تمامی محیط های برنامه نویسی در این زمینه ها پیشنهاد میکنم خیلی راه دوری نروید زیرا با استفاده از محیط برنامه نویسی Qt که پشتشم یه زبان غولی مثل C++‎‎‎‎ واستاده تقریبا همه آرزوهای شما در برنامه نویسی فراهم می شود.

    در رابطه با توانایی ها و قدرت زبان C++‎‎‎‎ آشنا هستید اینکه یک زبان مادر (پایه) است و خود مستقیم بدون متکی و وابسته بودن یه به سیستم عامل یا زبان برنامه نویسی دیگری کار خودش رو انجام می دهد , در این میان طی این سال ها که زبان های برنامه نویسی پیشرفته بسیار زیادی رو داشتند طوری که برنامه نویسان به راحتی میتوانند توسط زبان های مثل C#‎‎‎‎ و ... برنامه های مورد نظر خود را در کمترین زمان با محیط و گرافیک قابل توجهی تولید کنند که تمامی این موارد باعث شده بود زبان C++‎‎‎‎ از نظر برنامه نویسان بی حوصله یک زبان سخت و خواستار حال حوصله درست حسابی از طرف برنامه نویس می باشد بنا بر این دلایل سختی و همچنین ساده نبودن طراحی توسط این زبان شاید دلیلی برای کم رنگ شدن این زبان در طراحی و تولید فرم ها و خروجی های قوی بود که ذتا هر کسی که با این زبان واقعا کار کرده میداند که چنین نیست ! زیرا به تنهایی تکمیل و جامع است فقط وقت و کد نویسی بیشتری برای تولید خروجی های مشابه در زبان های دیگری همچون C#‎‎‎‎ را دارد ؛ حال چکار کنیم ؟ آیا با این حال برنامه نویسی با سرعت کم در این زبان خواهان خودش رو داره ؟

    جواب سوال رو اینگونه پاسخ میدم : اولا نیازی نیست به کد نویسی زیاد و سخت چون همونطور که زبان های دیگه در طی این سالها پیشرفت کرده زبان C++‎‎‎‎ هم خالی از پیشرفت نبوده و نسبت به قبل بسیار توانمند و خود کفاست , در این میان نه تنها در رابطه با قابلیت ها موارد زیادی در نسخه های 11 این زبان رفع و توسعه داده شده است در کنار این IDE بسیار جذابی که به داد برنامه نویسان و مشتاقان این زبان اومده به نام Qt ! با آوای (کی یوت) یا کیوت؛

    همه چیز ساده تر , روانتر و جذابتر شده و سرعت برنامه نویسی و طراحی فرم ها و قالب بندی های پیشرفته که قبلا نیاز به کد نویسی های بسیار زیادی داشت بسیار بهتر از قبل شده به طوری که به جرئت میتونم بگم من خودم که بسیار سخت پسند هستم در نگاه اول کار با Qt رو پسندیدم , این محیط بر خلاف محیط های VS به هیچ عنوان سیاست انحصاری بودن رو ندارد و فقط ویندوز نیست که از قدرتمندترین IDE این دوره زمونه پشتیبانی میکند بلکه سیستم عامل های قدرتمند یونیکسی مثل Linux Ubuntu و Mac OS X این محیط برنامه نویسی خارق العاده رو کاملا پشتیبانی میکنن و این در ابتدای کار به تنهایی ارزشمند است.

    از قابلیت هایی که نمیشه ازشون به این راحتی چشم پوشی کرد می توان به قابلیت Cross platform بودن برنامه های تولید شده توسط C++‎‎‎‎/Qt اشاره کرد که شما به راحتی میتونید خروجی رو در سیستم عامل مورد نظرتون دریافت و کامپایل کنید حتی سیستم عامل هایی مثل IOS و Android که امروزه برنامه نویسی موبایل هم یجورایی بازارش گرمه.

    قابلیت ها در طراحی : قابلیت طراحی فوق العاده با QML و همچنین پشتیبانی از CSS و HTML یکی دیگه از مزایای Qt هستش که میتونید برنامتون رو بترکونید مثلا فرض کنید یک فرم طراحی میکنید در حالت عادی خالی از style و افکت های ویژه هست برای این کار میتونید با استفاده از HTML و CSS برنامتون رو به طور شگفت انگیزی طراحی کنید.

    استفاده از قابلیت های HTML یکی از بهترین و جذابترین مواردی میتونه باشه که در برنامه نویسی Desktop و Mobile خیلی خیلی جذاب خواهد بود همه این قابلیت ها دست به دست هم میدن تا برنامه نویس سختی های C++‎‎‎‎ رو فراموش کنه و با علاقه تمام برنامش رو طراحی و در نهایت ری هر پلتفرمی که دوست داره کامپایل کنه.

    یه چکیده کلی از تعریف این محیط : دیگه نیازی نخواهد بود برین سراغ Objective-C برای تولید نرم افزار های IOS و MAC OS X یا نیازی نیست برید سراغ Java برای تولید نرم افزار های Android یا نیازی نیست برید سراغ زبان های بدبختی مثل VB یا C#‎‎‎‎ برای تولید برنامه های ویندوزی ! و در نهایت نیازی نیست فقط مجبور باشید برای صنعت سخت افزار از C++‎‎‎‎ استفاده کنید بلکه با داشتن علم یک زبان قدرتمندی مثل C++‎‎‎‎ میتونید با یک تیر چندین نشان رو همچین بزنید که خدا بداند که چه شود !!!

    یادم نره بگم که میتونید طراحی وب هم داشته باشید هامنظورم از همه کاره بودن یعنی واقعا همه کارست :)

    پس شد یاد گیری زبان C++‎‎‎‎ و آشنایی با محیط Qt که یک نوع فریم ورک ویژه ای برای این زبان است برنامتون رو بترکونید حالا با در نظر داشتن اینکه اطلاعات HTML , CSS , QML , JavaScript رو هم دارید دیگه چه بهتر هرطور که مهربونتون می خواد مانور بدین که در نهایت منجر به یک خروجی مقابل میشود : قدرت , سرعت , کیفیت , ارتباط مستقیم با سخت افزار ! و در کنار این محیط با کیفیت بالا و همچنین طراحی مدرن همه و همه در خروجی نهایی برنامه شما حس خواهد شد.


    حالا هی برید بگید C++‎‎‎‎ سخته و یا C++‎‎‎‎ هیچی نمیشه باهاش ساخت :) برید هی تاپیک باز کنید که از کدوم زبان استفاده کنم ! همه این برنامه های غولی که روزانه باهاشون در ارتباط هستید از C++‎‎‎‎ اب میخوره...
    آخرین ویرایش به وسیله کامبیز اسدزاده : دوشنبه 23 دی 1392 در 01:21 صبح

  3. #3

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله 2 : راهنمایی برای دانلود مناسبترین نسخه از Qt

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

    نکته : برای استفاده از Qt ما دو روش داریم که در این دو روش یکیش رایگان هست و یکیش شامل هزینه ای در رابطه با لیسانس IDE هستش , در رابطه با این دو مورد باید بگم هیچ تفاوتی آن چنانی بین این دو نسخه پولی و رایگان وجود نداره به جز نوع کامپایل اون که در نسخه پولی شما میتونید خروجی static بگیرید و تنها در صورت پرداخت هزینه میتونید برنامتون در حالت Static رو به فروش برسونید , فعلا میریم سراغ نسخه تحت مجوز LGPL که به شما اجازه کامپایل به صورت داینامیکی رو میده.

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

    ما در بخش دانلود سایت رسمی Qt انواع مختلفی از ویرایش های اون را میبینیم که در لینک رسمی موجود هست : http://www.qt.io/download-open-source/

    قبل از همه چیز باید سیستم عاملی که شما روی اون کار میکنید رو مشخص کنید هرچند الان 99 درصد روی ویندوز کار میکنید ولی وقتی دیگه اسم C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎ میاد وسط تورو خدا ولش کنید این سیستم عامل رو برید روی Linux یکم به خودتون تغییر تحولات بدین هم از لحاظ روحی تاثیر داره هم تجربه میکنید و این خوبه.

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

    مثلا : Qt 5.4.0 for Windows 64-bit (VS 2013, OpenGL) یعنی چی ؟

    خب Qt 5.4.0 که نام و نسخه برنامه هست for Windows همون نوع سیستم عامل هست که روش باید نصب کنید 64-bit معماری سیستم عامل نصب شده هستش دقت کنید شاید CPU شما 64 بیتی باشه ولی اگه نسخه 32 بیتی سیستم عامل رو نصب کردین باید در این حالت 32 بیتی Qt رو دریافت و نصب کنید ! VS 2013 و یا MinGW 4.9 نوع کامپایلر همراه با Qt هستش و مورد آخر اگه OpenGL رو نسخه شما باشه یعنی Qt شما از OpenGL هم پشتیبانی میکنه.

    حالا بریم سر اصل مطلب :

    در صورتی که از سیستم عامل ویندوز استفاده میکنید نسخه های Qt 5.5.1 for Windows رو باید دریافت و نصب کنید.
    در صورتی که از سیستم عامل لینوکس (Ubuntu) استفاده میکنید نسخه های Qt 5.5.1 for Linux رو باید دریافت و نصب کنید.
    در صورتی که از سیستم عامل مکینتاش (Mac OS X) استفاده میکنید نسخه های Qt 5.5.1 for Mac رو باید دریافت و نصب کنید.

    حالا توضیحات در باره جزئیات نسخه ها برای دانلود : نسخه های 32 بیتی همون معماری x86 هستند و نسخه های 64 بیتی هم همون مهماری x64 هستند.

    در حالت عادی شما میتونید روی سیستم عامل های دسکتاپی کار کنید و برنامتون رو کامپایل کنید ولی اگه نیاز به کامپایل برنامه روی سیستم عامل های IOS و Android دارید باید نسخه های زیر رو دانلود کنید :

    برای Android میتونید از نسخه Qt 5.5.1 for Android Windows برای استفاده در محیط ویندوز دانلودش کنید.
    برای Android میتونید از نسخه Qt 5.5.1 for Android for Linux برای استفاده در محیط لینوکس دانلودش کنید.

    برای IOS حتما باید سیستم عامل مک داشته باشید و نسخه Qt 5.5.1 for iOS رو دانلود کنید , همچنین میتونید Qt 5.4.0 for Android رو هم برای کامپایل برای اندروید در محیط مک دانلود کنید و یا هر دویه اینهارو میتونید به صورت Qt 5.5.1 for Android and iOS دریافت کنید.

    یک نکته : چون سیستم عامل IOS و Mac بدتر از مایکروسافت انحصار طلب هستند به همین خاطر برای کامپایل برنامه های IOS و Mac حتما باید سیستم عامل مک داشته باشید تا بتونید برنامه های مربوط به Apple رو کامپایل کنید.


    توجه : لازم نیست شما برای هر کدام از پلتفرم ها دوباره نویسی و کد نویسی مجدد انجام بدین خیالتون راحت شما میتونید برای شروعبرای ویندوز یا لینوکس یه نسخه مورد نظر رو دریافت کنید و برنامتون رو بنویسید در نهایت که دیدین نیاز هست روی سیستم های مثل IOS و MAC یا Android کامپایل و آزمایش کنید اونوقت بهتره نسخه مربوطه رو دریافت و پروژه خودتون رو به وسیله نسخه مورد نظرتون Import و کامپایل نمایید.


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

    خب برای شروع نسخه Qt 5.5.1 for Windows 32-bit (MinGW 4.9.1, 852 MB)

    یا میتونید این رو دانلود کنید : Qt 5.5.1 for Windows 32-bit (VS 2013)

    فقط اگه نسخه VS2010 یا VS2012 و یا 2013 رو دانلود میکنید حتما باید Visual Studio مربوط به اون نسخه یا SDK های مربوطه روی سیستمتون نصب باشه.

    من از کامپایلر MinGW استفاده میکنیم ذاتا مثل VS خیلی پر دردسر نیست برا همین !

    اینم تاپیک معرفی و آماده سازی Visual Studio برای کار با کتابخانه Qt : آموزش نصب Qt در Windows و Linux

    دررابطه با لینوکس و مخصوصا Ubuntu هم به روش زیر عمل کنید :بر فرض اینکه فایل qt-opensource-linux-x64-5.3.0.run رو دانلود کرده باشید اگر قرارش بدین در پوشه Downloads و دستور زیر رو تو Terminal بنویسید :


    cd /home/kambiz/Downloads


    به جای این kambiz که اینجا یوزر من هست یوزری که رو سیستم خودتون هست رو بنویسید البته دقت کنید قبلش باید توسط su - روت شده باشید !
    بعد از اینکار تشریف ببرید روی فایل qt-opensource-linux-x64-5.5.1.run که تو پوشه Downloads هستش راست کلیک و Properties کنید و در زبانه Permissions اون پایین گزینه Execute رو تیک بزنید و بعد برید ترمینال دستور زیر رو بنویسید...


    ./qt-opensource-linux-x64-5.5.1.run


    دستور جاری یه چیزی به این صورت هستش :


    root@kambiz-Aspire-4720Z:/home/kambiz/Downloads# ./qt-opensource-linux-x64-5.5.1.run


    و در مراحل بعدی Wizard برای نصب میاد بالا و بقیه مراحلش همانند آموزش های ویندوزی هستش.
    آخرین ویرایش به وسیله کامبیز اسدزاده : پنج شنبه 28 آبان 1394 در 08:18 صبح دلیل: به روز رسانی نسخه به Qt 5.5.1

  4. #4

    Lightbulb نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    با سلام ؛

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


    1. منوی اصلی / نوار ابزار ها (شامل منوی های استانداردی هست که اکثرا در هر محیط برنامه نویسی یافت میشود)
    2. شامل گزینه New project و Open project جهت دسترسی و ایجاد پروژه هاست و همچنین اجازه دسترسی برای شروع کار طبق آخرین جلسات کاری و جلسات ذخیره شده به صورت پیشفرض رو در اختیار قرار میدهد.
    3. قسمت ویرایش یا همان Edit بخش ویرایش که در صورت وجود پروژه مشمول محتویات پروژه شما شده و اون رو به صورت ساختار درختی نشون میده که در کل امکان انتخاب فایل های موجود در پروژه رو میده.
    4. بخش طراحی و Design شامل محیط طراحی , ابزار ها و موارد مرتبط با طراحی پروژه میباشد.
    5. بخش Debug که مشخصه مربوط به عملیات دیباگینگ هستش
    6. این بخش مربوط به تنظیمات پروژه مثل تنظیمان نوع Build و غیره هست
    7. این قسمت مربوط به آنالیز پروژه هستش و میتونید با اجرای اون پروژه رو در حین کامپایل و اجرای آنالیز نمایید
    8. یکی از بهترین قسمت های پرکاربرد برای مبتدیان بخش Help هستش که میتونید با مراجعه با این قسمت و جستجوی دستورات و عبارات مورد نظر آموزش هایی رو در رابطه با موضوع دریافت نمایید.
    9. نوع کامپایلر و خروجی رو تنظیم میکنه و عملیاتی مثل Build , Compile , Rebuild , Run و ... رو انجام میده
    10. مورد آخر شامل نوار وضعیت های پروژهست که شامل موارد Output و ... برای مشاهده انواع رخداد ها و خروجی ها به صورت کنسول میباشد.


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

    به عنوان مثال تصویر نشان دهنده این است که کامپایلرهای VS و MinGW روی Qt به درستی نصب و قابل اجرا میباشند.

  5. #5

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎‎‎‎/Qt به صورت گام به گام

    با سلام ؛

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

    برای شروع به منوی File و گزینه New File or Project مراجعه کنید.

    حالا در این قسمت شما انواع پروژه ها و فایل هایی که میتونید توسط Qt ایجاد کنید با توجه به نسخه ای که نصب کردین فعال و قابل انتخاب هستش که من در این اموزش ها از پروژه Qt Widgets Application استفاده میکنم و تقریبا میشه گفت استانداردترین حالت پروژه برای طراحی فرم هست با بقیه موارد از قبیل Qt Console یا ... فعلا کاری نداریم.

    حال با ادامه این مرحله به صورت زیر نام پروژه و مسیری که مایل هستید پروژه در اون مکان ذخیره بشه رو انتخاب کنید :

    در مرحله بعدی نوع کامپایلر در صورت نصب بودن تایید و انتخاب میشود به صورت زیر :

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

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


    خب تا اینجا ما فقط یه پروژه از نوع QtWidgets ایجاد کردیم که شامل Main Window و کلاس و هیدر های استاندارد برای شروع کار و برنامه نویسی هستش.

    ببینید در پروژه های Qt ما چند نوع فایل پروژه ای داریم با پسوند های .pri و .pro که هر دوی این فایل ها توسط Qt قابل شناسایی هستند و به عنوان فایل اصلی پروژه شما در نظر گرفته میشوند.

    اگر روی فایل MyProject.pro کلیک کنید به صورت زیر شامل کد هایی هستش :


    #-------------------------------------------------
    #
    # Project created by QtCreator 2014-01-15T08:19:15
    #
    #-------------------------------------------------

    QT += core gui

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

    TARGET = MyProject
    TEMPLATE = app


    SOURCES += main.cpp\
    mainwindow.cpp

    HEADERS += mainwindow.h

    FORMS += mainwindow.ui



    حالا من به صورت زیر توضیحاتش رو میدم تا متوجه وجود این کد ها بشید ! فراموش نکنید فایل .pro مهمترین قسمت پروژه هستش که در فراخوانی فایل ها و رفرنس ها مهمه مثلا من اگه بخوام از دیتابیس و دستورات SQL استفاده کنم در این قسمت باید اول فراخوانیش کنم.


    #-------------------------------------------------
    #
    # Project created by QtCreator 2014-01-15T08:19:15 (پروژه ساخته شده توسط کیوت در تاریخ فلان)
    #
    #-------------------------------------------------

    QT += core gui (این قسمت مربوط به فراخوانی موارد لازم هست یه چیزی مثل رفرنس گیری در ویژوال استدیو که به صورت کد نوشته میشه)

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets (مربوط به نسخه ویدجت در کیوت هستش)

    TARGET = MyProject (نام پروژه رو به صورت Namespace که در ویژوال استدیو هم دیدین فراخوانی میکنه)
    TEMPLATE = app (قالب بندی)


    SOURCES += main.cpp\
    mainwindow.cpp (سورس اصلی که شامل تابع main هستش رو فراخوانی میکند)

    HEADERS += mainwindow.h (هیدر پنجره اصلی رو فراخوانی میکنه)

    FORMS += mainwindow.ui (فایل و قسمتی که شامل طراحی هستش رو فراخوانی میکند)



    خب بعد از این فایل ما چند پوشه به نامهای Headers , Sources و Forms داریم که به صورت زیر توضیحاتشونو میدم.

    پوشه Headers وظیفه نگهداری تمام فایل های C++‎‎‎‎‎‎‎‎ از نوع .h یا همان heder رو بر عهده دارد.
    پوشه Sources وظیفه نگهداری تمام فایل های C++‎‎‎‎‎‎‎‎ از نوع .cpp یا همان Source رو بر عهده دارد.
    پوشه Forms وظیفه نگهداری تمام فایل های مربوط به طراحی رو داره پسوند فایل های طراحی در کیوت ui هستند به صورت mainwindow.ui که فایل دیزاین پروژه شما به عنوان یک فرم در نظر گرفته شده است.


    لینک رسمی مربوط به این پست
    آخرین ویرایش به وسیله کامبیز اسدزاده : سه شنبه 24 دی 1392 در 21:27 عصر

  6. #6

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله سوم : معرفی و کار با Signal و Slot ها و Event ها

    نکته : من قصدم اینه که در ساده ترین حالت آموزش رو ارائه بدم به خاطر اینکه افراد شاکی از کد نویسی زیاد C++‎‎‎‎ کمی دیدگاهشون رو در رابطه با این زبان تغییر بدن بد نیست... مخصوصا اونایی ک میگن کی حوصله داره تو C++‎‎‎ هزار خط کد بنویسه تا یه پیغام نمایش بده !!!

    سیگنال یا اسلات ها چین ؟ به چه دردی میخورن ؟ مسلما شما برای ایجاد یک رخداد در یک زمان با اثر گذاری بر روی یک کنترل یا Object انتظار اینو دارین که اون شیء در قبال فشرده شدن یا هر رویداد دیگه ای یک عکس العملی نشون بده مثلا روی یک دکمه ای کلیک میکنید انتظار دارید یه پیغامی در رویداد Clicked اون نمایش داده بشه منظور از Signal و Slot در رابطه با این مسائل هستش که حالا در این میان برای صدا زدن از Signal استفاده میکنیم و از Slot برای دریافت دستور و عمل کردن.

    من قصد دارم برای شروع کار روی یک فرمی 2 تا دکمه ایجاد کنم و روی این دوتا دکمه 2 از رویداد (Clicked) کلیک شدن استفاده کنم.

    خب به قسمت Forms در پروژه برید و روی فایل mainwindow.ui دوبار کلیک کنید تا محیط طراحی فرمتون رو ببینید به صورت زیر دو تا دکمه با عمل Drag and Drop روی فرم خودم ایجاد میکنم در صورتی که کامپایل و اجرا کنید دکمه های ایجاد شده رو روی فرمتون میبینید ولی بدون هیچ عملی !



    بر خلاف Visual Studio و زبان C#‎‎‎‎ که روی Object ها کلیک میکنید و تابع مربوط به رویداد اون ساخته میشه و شما شروع میکنید به برنامه نویسی در Qt چنین چیزی وجود نداره در کل توی C++‎‎‎‎ کلیک کد کد بنویس بی معنیه باید کوهو بکنی تا بتونی دستور بدی به رویداد ها.... ولی من یه روش ساده تری رو بهتون میگم به صورت زیر روی کنترل راست کلیک میکنیم و گزینه Go to Slot رو انتخاب میکنیم.


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


    خب حالا اینجا تابع مربوط به عمل کلیک شدن روی این دکمه ایجاد شده.



    void MainWindow::on_pushButton_clicked()
    {

    }



    در فایل mainwindow.h کد زیر اضافه شده که تعریف Slot مربوط به کنترل میباشد.


    private slots:
    void on_pushButton_clicked();



    منظور از pushButton نام همان دکمه ای هستش که روش کلیک میشه مسلما نام دکمه بعدی pushButton_2 خواهد بود ! شما میتونید این تابع رو بدون عملیاتی که در تصویر دیدین ایجاد و به هر یک از کنترل های خودتون اختصاص بدین.

    حالا این بخش مشخص کرد که ایجاد Event های مربوط به کنترلر ها چطور صورت میگیره به صورت کد نویسی این روش هارو میشد بریم ولی خواستم ساده ترین حالتش رو نشونتون بدم تا عوض اونهمه کد نویسی در C++‎‎‎‎ به صورت عادی در بیاد.

    برای اینکه این بحث رو یجورایی کامل کنم میخوام یه پیغامی رو با کلیک روی این دکمه نمایش بدم پس طبق قوانین C++‎‎‎‎ ابتدا هیدر Message رو فراخوانی میکنم که در کیوت هستش QMessageBox به صورت زیر :


    #include "qmessagebox.h"


    و کد زیر رو در داخل تابع رخداد کلیک مینویسم :


    QMessageBox msgBox;
    msgBox.setText("Welcome to the Qt 5.2 , My name is Kambiz Asadzadeh");
    msgBox.exec();


    کاملش هست :


    void MainWindow::on_pushButton_clicked()
    {

    QMessageBox msgBox;
    msgBox.setText("Welcome to the Qt 5.2 , My name is Kambiz Asadzadeh");
    msgBox.exec();

    }




    خب حالا باید بعد از کامپایل و اجرا هنگام کلیک روی دکمه Show Message خروجی بشه مثل زیر :



    فایل پروژه رو هر مرحله که آموزش به اتمام میرسه به صورت زیر ضمیمه خواهم کرد.

    لینک رسمی مربوط به این پست (معرفی و کار با Signal و Slot ها و Event ها)
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : سه شنبه 24 دی 1392 در 22:36 عصر

  7. #7

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله چهارم : معرفی و کار با نمایش Windows

    با سلام ؛

    امروز من قصد دارم در رابطه با پنجره ها یا همان دیالوگ ها یا در زبان Qt همون Widgets ها توضیحاتی بدم.
    طبق روال عادی یک پروژه به نام MyWindows ایجاد میکنیم که در حالت عادی اگه توجه کنید پروژه دارای یک MainWindow یا همون فرم اصلی هستش ایجاد میکنه.

    حال ما برای اینکه از فرم ها و دیالوگ های دیگه ای در پروژمون استفاده کنیم باید چکار کنیم ؟

    خیلی راحته برای این کار روی پروژه یعنی MyWindows راست کلیک میکنیم و گزینه Add new رو طبق تصویر زیر میزنیم.


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

    انواع گزینه های مختلفی وجود داره کدومو باید انتخاب کنیم و چرا ؟ خب ببینید شما بر اساس نیاز اگر میخواهید فرم تولید شده شما دارای هیدر و کلاس اختصاصی خودش باشه میتونید در همین مرحله اون رو تعیین کنید که آیا هیدر و کلاس مخصوص فرم من ایجاد بشه یا خیر ! در اکثر موارد لازمه پس من از Qt Designer Form class استفاده میکنم...


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


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


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


    من چون در هر پست میتونم حد اکثر 5 تا تصویر ضمیمه کنم برای همین ادامه بحث رو در پست بعدی انتقال میدم.
    آخرین ویرایش به وسیله کامبیز اسدزاده : چهارشنبه 24 اردیبهشت 1393 در 18:03 عصر

  8. #8

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله چهارم : معرفی و کار با نمایش Windows

    خب حالا فرم ما تا اینجا ایجاد شده من میخوام فرمم رو داخل فرم اصلی توسط عمل کلیک شدن روی یک کنترل دکمه (Button) فراخوانی و نمایش بدم.

    باید چکار کنیم ؟ من میخوام در فرم اصلی یه دکمه ای ایجاد کنم و در رویداد کلیک شدن اون فرم دوم خودم یعنی MyForm رو صدا بزنم تا Show بشه.

    پس یا به صورت سریع از Got to Slot و کلیک استفاده میکنم روی دکمه ایجاد شده و یا در فایل هیدر فرم اصلی این کد رو مینویسم.


    void MainWindow::on_pushButton_clicked()
    {

    }



    در هر دو روش این کد رویداد کلیک رو ایجاد میکنه حالا من بخوام فرم دومم رو صدا بزنم چکار بدید کنم...

    به این کد نگاه کنید :


    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::on_pushButton_clicked()
    {



    }



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

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


    #include "myform.h"


    و در نهایت در تابع کلیک کد زیر رو مینویسم :


    void MainWindow::on_pushButton_clicked()
    {


    MyForm *dialog = new MyForm();
    dialog->show();

    }


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


    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "myform.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::on_pushButton_clicked()
    {


    MyForm *dialog = new MyForm();
    dialog->show();

    }



    خروجی هم بعد از کلیک روی دکمه میشه به صورت زیر :


    لینک رسمی این پست (کار با Windows و نحوه نمایش آن)
    فایل های ضمیمه فایل های ضمیمه

  9. #9

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    قسمت پنجم : معرفی و کار با لایه ها زبانه ها و بدنه های در طراحی

    با سلام ؛

    در این مرحله در رابطه با لایه های طراحی و امکانات توضیحاتی بدم که طبق روال قبلی پروژه ای ایجاد میکنیم به نام MyGui و میریم سر اصل مطلب...

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

    ابتدا توضیحات قسمت اول رو به صورت زیر میدم :

    گزینه Edit Widgets : در حالت کلی وقتی لازمه ابزار ها و کنترل هایی رو روی فرم قرار بدیم یا به طور ساده بخوام بگم وقتی نیاز باشه روی فرمتون شیئی رو درج کنید حتما باید در این لایه کار کنید.

    گزینه Edit Signals/Slots : به صورت کلی این لایه وظیفه در اختیار گذاشتن سریع دسترسی های مربوط به Signal ها و Slot ها رو در اختیار شما میزاره که با عمل Drag و Drop اشیاء روی همدیگه مراحل بعدیش نمایان میشود.

    گزینه Edit buddies : این لایه امکان تنظیم اندازه فرم رو براتون فراهم میکنه.

    گزینه Edit tab order : در این لایه از طراحی شما میتونید به راحتی شماره ایندسک یا همان Index number اختصاصی هر یک از اشیائ رو روی فرم مشخص کنید که با عمل Tab نیز بر اساس اولویت انتخاب می شوند.

    یه نکته مهم در Qt وجود داره اونم اینه که عملیات Drag و Drop بر خلاف IDE های دیگه امکانات بسیار زیادی رو برای راحتی کار ایجاد میکنند.

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

    لینک رسمی این پست در رابطه با معرفی و کار با لایه ها زبانه ها و بدنه های در طراحی
    آخرین ویرایش به وسیله کامبیز اسدزاده : شنبه 28 دی 1392 در 21:00 عصر

  10. #10

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله ششم : معرفی و کار با قابلیت های HTML و CSS در طراحی

    با سلام؛

    همانطور که میدونید امروزه داشتن گرافیک و طراحی های درست حسابی روی نرم افزار نویسی خودش یکی از مهمترین قسمت های تولید یک برنامه هستش که اکثرا به خاطر ای دلیل که C++‎‎‎‎‎‎ رو فقط یک محیط Console میدونن سراغ این زبان نیومدن نمیدونم چرا شاید براشون سخته یا شایدم اطلاعات کافی ندارن...

    ولی در کل اگه با زبان های راحتی مثل C#‎‎‎‎‎‎ کار کردین میدونید که برای طراحی فناوری هایی مثل WPF رو دارند که بجای CSS از XAML استفاده میکنه و در نوبت خودش در طراحی کیفیت خوبی رو در خروجی ارائه میده.

    ولی هرچی باشه خودتون میدونید طرح هایی که در برنامه های تحت وب تولید میشن همشون به کمک CSS و HTML هستش و همچنین JavaScript و ... حالا اگه این فناوری ها روی پلتفرم های دسکتاپی باشه چی میشه ؟ مسلما یکی من خودم خیلی خوشحال میشم و WPF رو میزارم کنار و میام سراغ همین Qt.

    قبل از هرچیز یه تعریفی در رابطه به CSS و HTML بدم بعد بریم سر اصل مطلب....

    فناوری CSS با آوای (سی‌اس‌اس) : روشی ساده برای نمایش چیدمان و جلوه‌های تصویری (مانند نوع قلم، رنگ و اندازه‌ها) بر صفحه‌های وب است. شیوه‌نامهٔ آبشاری از جنس زبان‌های نشانه‌گذاری، با ساختار متن سادهٔ رایانه هستند و درون هرکدام، دستورهایی آبشار مانند و پی‌درپی، برای چگونگی نمایش هر صفحه وب افزوده می‌شود. به گفته‌ای ساده تر، این دستورها روش نشان داده شدن قلم‌ها و اندازه شان، رنگ‌ها و پس زمینه‌ها، روش چیدمان موزاییک‌های دربرگیرنده داده‌ها (دیواره‌ها)، و بسیاری دیگر از عنصرهای ساختار هر صفحه وب را، درون خود جای می‌دهند.

    فناوری HTML : زبان امتدادپذیر نشانه‌گذاری فرامتن یا اکس‌اچ‌تی‌ام‌ال (Extensible HyperText Markup Language - XHTML) همان اچ‌تی‌ام‌ال است به همراه رعایت دقیق تمامی قواعد و دستورات نحوی نزدیک‌تر به زبان اکس‌ام‌ال که موجبات افزایش اطمینان از عمل‌کرد صححیح سندها در شرایط پیچیده‌تر موجود در اینترنت امروزین را فراهم می‌سازد. XHTMLها، نوع‌های سندها و ماژول‌ها در حال حاضر و در آینده هستند که در واقع زیر مجموعه و گسترش یافته HTML4 است. این نوع اسناد بر پایه XML هستند و برای کار در ترکیب با عامل کاربر مبتنی بر XML طراحی شده‌اند. و در حال حاضر نیز جدیدترین آن HTML5 هستش.



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



    سوال .... مگر HTML و CSS مختص طراحی وب نیست ؟ در جواب باید گفت بله... ولی از این به بعد نه همونطور که متوجه شدید در Qt ما قابلیت این رو خواهیم داشت از دستورات HTML و CSS در طراحی استفاده کنیم برای همینه که دارم میگم بهتر از این نمیشههههههه اقا نمیشههه !

    بریم سر پروژه ... مثل قبل یه پروژه ایجاد میکنیم با نام MyDesign و از نوع همون Widgets ...
    خب حالا برای شروع کار از HTML من میخوام شروع کنم که چطوری میشه دستورات HTML رو توی کد های C++‎‎‎‎‎‎ استفاده کرد.

    فرض کنید من یه متنی هست در روی یه label یا هر شیئ دیگری میخوام توسط کد های HTML بهش ویژگی های خاصی بدم... میام کد رو به صورت زیر در نظر میگیرم :

    یه Label و 2 تا دکمه ایجادمیکنم که در حالت عادی به صورت زیر دارای افکت و شکل ظاهرای استانداردی هستند که از استایل پیشفرض سیستم عامل تبعیت کردن ...


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


    "<b>This is C++‎‎‎‎‎‎/Qt HTML Code</b>"


    میبینید این کد در بین تگ های دستور bold که با <b> اغاز کننده و </b> خاتمه دهنده شروع شده قرار گرفته و تمامی اونهارم در بین "" و یا ' قرار میدیم تا قابل شناسایی برای کامپایلر باشه.

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


    ui->label->setText("<b>This is C++‎‎‎‎‎‎/Qt HTML Code</b>");


    این کد چی میگه؟ خیلی راحت داره میگه آقا جان از کلاس فرم من شیئ label رو انتخاب کن و متن یا همون محتویاتش رو برام در بین کد HTML ست کن. که رد حالت عادی به صورت زیر هستش.


    ui->label->setText("This is C++‎‎‎‎‎‎/Qt HTML Code");


    تنها چیزی که من اضافه کردم چیه ؟ فقط تگ های شروع و پایان دهنده Bold هست پس در نتیجه شما با وارد کردن تگ های HTML به صورت استاندارد در کدتون میتونید ازشوتن استفاده کنید.

    نتیجه خروجی :

    میبینید طبق تصویر مقایسه کنید متن label در حالت HTML پر رنگ شده به حالت bold تغییر کرده.

    یه مثالی میزنم در رابطه با Tooltip با HTML ... طوری که وقتی روی دکمه اول ماوس رو نگه داریم یه Tooltip باز بشه که توسط HTML نوشتیم.

    برای اینکار باید از Propertie چی استفاده کنیم ؟ مسلما باید از setToolTip استفاده کنیم :)

    به این روش :


    ui->pushButton->setToolTip("Hello <font color='red'><b>My name is Kambiz Asadzadeh</b></font>"
    "<ul>"
    "<li>Item 1</li>"
    "<li>Item 2</li>"
    "<li>Item 3</li>"
    "</ul>");


    خروجی شد به صورت زیر :


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

    در رابطه با CSS یکم توضیح بدم چطور میتونیم یه CSS کد به فرممون نسبت بدیم.

    قبل از هر چیز باید اینو بگم شما میتونید هم با این روشی که گفتم در بین تگ های HTML از CSS استفاده کنید هم روش های دیگه در کد نویسی خود C++‎‎‎‎‎‎ و همچنین روش دستی در قسمت طراحی توسط Qt به صورت های زیر...

    روش اول رو که دیدین...روش دوم چطوریه در روش دوم شما میتونید از خاصیت setStyleSheet برای کنترل ها و اشیائ استفاده کنید مثلا به صورت زیر :


    ui->label->setStyleSheet("color: #ff0000;");


    خروجیش میشه تصویر زیر :


    تغییری که کرده رنگ محتویات label قرمز شده که توسط خاصیت CSS بهش ربط دادیم.

    حالا میشه با یه روش دیگه ای هم این کار رو کرد اونم اینه روی فرم و روی label راست کلیک میکنیم و گزینه Change StyleSheet رو انتخاب میکنیم در این حالت میتونید بر اساس نام کلاس و شناسه هر یک خاصیت و استایل رو ست کنید.

    مثلا کد زیر رو در کادر باز شده وارد کنید و تایید کنید :


    color: rgb(0, 85, 255);


    رنگ خروجی میشه آبی...

    در کل باید بگم شما میتویید کلا کدهای CSS رو در مرحله طراحی و همچنین کد نویسی به برنامتون ربط بدین و یا در نهایت یه کلاس های درست حسابی بنویسید برای استایل برنامتون و کلی کارای دیگه.

    لینک رسمی در رابطه با این پست (کار با HTML و CSS)
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : شنبه 17 خرداد 1393 در 11:39 صبح

  11. #11

    Smile نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    با سلام؛

    مرحله هفتم : معرفی و کار با لایه های افقی و عمودی

    در رابطه با این قسمت یکم توضیحاتی بدم که هدف چه چیزی هست و بعد بریم سراغ آموزش.

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

    برای شروع پروژه ای رو ایجاد میکنم و نامش رو میزارم MyLayout میتونیم این پروژه رو بدون widget هم ایجاد کنیم چون در این مرحله از کد نویسی برای ایجاد فرم و لایه ها استفاده خواهیم کرد.

    ببینید قبل از هر چیزی من میخوام یک فرمی به عنوان پنجره ایجاد کنم و همچنین کنترل های لازم رو بر روی اون فراخوانی خواهم کرد.

    برای این کار ما باید موارد لازم رو Include کنیم که در این مرحله ما نیاز به کلاس QWidget و QPushButton و QHBoxLayout و QVBoxLayout هستیم.

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

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


    QWidget *window = new QWidget;
    window->setWindowTitle("Window Layout");


    در این کد من یه نمونه از QWidget میگیرم و نامش رو window میزارم و در خط بعدیش عنوانی برای این فرم خودم توسط خاصیت setWindowsTitle براش در نظر میگیرم.

    حالا میخوام 3 تا دکمه در فرمم قرار بدم به صورت زیر برای هر کدوم از QPushButton نمونه میگیرم.



    QPushButton *button = new QPushButton("Button One");
    QPushButton *button1 = new QPushButton("Button Two");
    QPushButton *button2 = new QPushButton("Button Three");


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

    حالا من اگه فرم رو همینجوری show کنم دکمه های نمونه گرفته شده من در داخل فرم نمایش داده نخواهند شد و فرم من به صورت پیشفرض در حداکثر اندازه نمایش داده خواهد شد ! ولی هدف من اینه که به کمک کلاس های افقی و یا عمودی Button ها رو در داخل فرم نمایش بدم و هچنین در این حالت اندازه فرم من بر اساس این کلاس متناسب با 3 دکمه نمونه گرفته شده در داخل لایه Re-Size خواهد شد.

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


    QHBoxLayout *hlayout = new QHBoxLayout;


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


    hlayout->addWidget(button);
    hlayout->addWidget(button1);
    hlayout->addWidget(button2);


    دقت کنید ... اینجا من میگم دکمه 1..2...3 رو هر 3 تاشون رو به لایه من اضافه کن.

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


    window->setLayout(hlayout);


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


    window->show();


    نتیجه این کارا میشه به صورو زیر :

    و

    و اگه از حالت عمودی استفاده کنیم به صورت زیر کد ها تغییر میکنند :


    QVBoxLayout *vlayout = new QVBoxLayout;

    vlayout->addWidget(button);
    vlayout->addWidget(button1);
    vlayout->addWidget(button2);

    window->setLayout(vlayout);



    خروجی :

    و


    کد کلی به صورت زیر :


    #include "mainwindow.h"
    #include <QApplication>
    #include <QPushButton>
    #include <QHBoxLayout>
    #include <QVBoxLayout>


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

    QWidget *window = new QWidget;
    window->setWindowTitle("Window Layout");

    QPushButton *button = new QPushButton("Button One");
    QPushButton *button1 = new QPushButton("Button Two");
    QPushButton *button2 = new QPushButton("Button Three");

    QHBoxLayout *hlayout = new QHBoxLayout;

    hlayout->addWidget(button);
    hlayout->addWidget(button1);
    hlayout->addWidget(button2);

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

    return a.exec();
    }



    لینک رسمی این پست
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : دوشنبه 30 دی 1392 در 23:41 عصر

  12. #12

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله هشتم : معرفی و کار با لایه های Grid در طراحی فرم

    سلام؛

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

    میریم سراغ یه پروژه با نام MyGridLayout در محله اول فرمم رو ایجاد میکنم طبق کد زیر :


    QWidget *window = new QWidget;
    window->setWindowTitle("Grid Window");


    حالا نیاز به لایه توری یا همون Grid دارم به صورت زیر اضافه میکنم :


    QGridLayout *Layout = new QGridLayout;


    حالا چند تا کنترل میخوام ایجاد کنم تا توی فرمم و داخل Grid درجشون کنم به صورت زیر :


    QLabel *label1 = new QLabel("First name:");
    QLineEdit *txtFirstName = new QLineEdit;
    QLabel *label2 = new QLabel("Last name:");
    QLineEdit *txtLastName = new QLineEdit;
    QPushButton *button = new QPushButton("OK");


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

    تابع به صورت زیر هستش :


    void QGridLayout::addWidget(QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)


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

    Layout->addWidget(label1,0,0);
    Layout->addWidget(txtFirstName,0,1);
    Layout->addWidget(label2,1,0);
    Layout->addWidget(txtLastName,1,1);
    Layout->addWidget(button,2,0,1,2);


    هر جا که لازم نباشه از عدد 0 به منظور در نظر نگرفتن مقدار میتونید استفاده کنید در غیر این صورت باید مقدار رو بر اساس اولویت یعنی 1...2...3 و ... وارد کنید و نتیجش میشه به صورت زیر :


    کد کامل همراه با اینکلود ها و دستورات تکمیلی کار...


    #include <QApplication>
    #include "QLabel"
    #include "QLineEdit"
    #include "QLayout"
    #include "QPushButton"

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

    QWidget *window = new QWidget;
    window->setWindowTitle("Grid Window");

    QGridLayout *Layout = new QGridLayout;

    QLabel *label1 = new QLabel("First name:");
    QLineEdit *txtFirstName = new QLineEdit;
    QLabel *label2 = new QLabel("Last name:");
    QLineEdit *txtLastName = new QLineEdit;
    QPushButton *button = new QPushButton("OK");

    Layout->addWidget(label1,0,0);
    Layout->addWidget(txtFirstName,0,1);
    Layout->addWidget(label2,1,0);
    Layout->addWidget(txtLastName,1,1);
    Layout->addWidget(button,2,0,1,2);

    window->setLayout(Layout);

    window->show();


    return a.exec();
    }


    لینک رسمی این پست (کار با لایه Grid)
    فایل های ضمیمه فایل های ضمیمه

  13. #13

    Smile نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله نهم : معرفی و کار با جدا کننده ها Splitter

    با سلام ؛

    امروز میخوام در رابطه با جداکننده یا همون Splitter یکم توضیحات بدم ... منظور از این اصطلاح چییه و تو برنامه نویسی به چه دردی میخوره ؟ در رابطه با این گزینه باید اینطور بگم فرض کنید شما فرمی دارید و فضای فرم شما هنگام تغییر اندازه کلی فرق میکنه و کنترل های موجو در اون هیچ تغییری هنگام تغییر اندازه فرم نمیکنند ! برای رفع این مشکل در صورت نیاز میتونیم به صورت زیر عمل کنیم.

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

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

    برای حل این مورد باید چکار کنیم ؟ خب طبق تصویر زیر هر دو کنترل رو انتخاب میکنم و بر اساس محور افقی و یا عمودی ستشون میکنم که من در این مثال از نوع Horizontal همون افقی برای Splitter انتخابشون کردم.


    حالا روی فرم کلیک میکنیم و گزینه Layout Horizontally رو انتخاب میکنیم تا به صورت زیر کنترل ها با فرم ما هماهنگ بشن.

    خب حالا بعد از اجرای فرم من همراه با کنترل هاش هماهنگ میشه و هنگام تغییر اندازه فرم کنترل هامم تغییر اندازه میدن و حتی اگه از حالت Drag و Move استفاده کنید میبینید که خاصیت Splitter فعال هست و راحت میشه تغییرش داد.


    شما طبق این آموزش میتونید نه تنها کنترل بلکه تو برنامه هاتون نوار ابزار هایی تولید کنید که مثل همین نوار ابزار های محیط برنامه نویسی سفارشی و قابلیت Splitter داشته باشند.

    اینم لینک رسمی مربوط به جدا کننده ها
    فایل های ضمیمه فایل های ضمیمه

  14. #14

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله دهم : معرفی و کار با دایرکتوری ها

    با سلام؛

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

    در Qt برای صدا زدن توابع کار با دایرکتوری باید از QDir استفاده کنیم.

    برای مثال من ابتدا اینکلود میکنم QDir رو و ازش یه نمونه میسازم و مسیری که میخوام بررسی کنم رو مشخص میکنم به صورت زیر :


    #include <QCoreApplication>
    #include <QDebug>
    #include <QDir>

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

    QDir MyDir("c:/");
    qDebug() << MyDir.exists();

    return a.exec();
    }




    در اینجا چه کردیم ؟ من از کلاس QDir یک نمونه گرفتم و مسیری که لازم دارم برای بررسی که همون دایرکتوری هستش رو بهش دادم و در مرحله بعدش اگر مسیری که من دادم رو تشخیص بده برام مقدار بولین true رو و اگر نه مقدار بولین false رو میده.

    ساختارش به صورت زیر هست :


    bool QDir::exists(const QString & name) const


    اگر مسیر موجود باشه True و اگر نباشه False رو برگشت میده.


    qDebug() << MyDir.exists();


    qDebug همون عمل چاپ رو انجام میده در مورد این توضیحات ندادم ولی کارش دقیقا مثل std::cout هستش که در حالت استاندارد میشه به این صورت ازش چاپ گرفت :


    std::cout << MyDir.exists();


    لینک رسمی این پست (کار با دایرکتوری)

  15. #15

    Red face نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله دهم : معرفی و کار با دایرکتوری ها

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

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


    QDir MyDir;
    foreach (QFileInfo MyItem,MyDir.drives())
    {
    qDebug() << MyItem.absoluteFilePath();

    }


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


    "C:/"
    "D:/"
    "E:/"


    کد کلی به صورت زیر :


    #include <QCoreApplication>
    #include <QDebug>
    #include <QDir>
    #include <QFileInfo>

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

    QDir MyDir;
    foreach (QFileInfo MyItem,MyDir.drives())
    {
    qDebug() << MyItem.absoluteFilePath();

    }

    return a.exec();
    }



    لینک رسمی این پست (نمایش تعداد درایور ها در ویندوز)
    آخرین ویرایش به وسیله کامبیز اسدزاده : شنبه 05 بهمن 1392 در 21:45 عصر

  16. #16

    Smile نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله یازدهم : معرفی و کار با فایل ها / خواندن و نوشتن در آن ها

    با سلام؛

    در این قسمت میریم سراغ کار با فایل ها در C++‎‎‎/Qt و خواندن محتویات فایل (Read)

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


    #include <QFile>
    #include <QString>
    #include <QTextStream>


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


    void Read(QString Filename)
    {
    QFile MyFile(Filename);

    if(!MyFile.open(QFile::ReadOnly | QFile::Text))
    {
    qDebug() << "could not open file for reading";
    return;
    }

    QTextStream in(&MyFile);
    QString MyText = in.readAll();

    qDebug() << MyText;

    MyFile.close();
    }



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


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

    Read("C:/TEST/test.txt");

    return a.exec();
    }


    خروجی شد به صورت زیر هر چیزی که در داخل فایل هستش :


    "My name is Kambiz Asadzadeh :)"


    قبل از هر چیز توضیح بدم که برای دریافت نام و مسیر فایل مورد نظر در تابع به صورت زیر باید نوشته بشه :


    void Read(QString Filename)


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

    حالا بریم سراغ توضیحات.... در مرحله اول در رابطه با تابع Read توضیح بدم....
    من ابتدا برای نوشتن و یا خواندن در داخل یک فایل باید از کلاس QFile یک نمونه بگیرم تا بتونم این کار رو انجام بدم پس به صورت زیر ابتدا یه نمونه گرفتم :



    QFile MyFile(Filename);


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

    به صورت زیر :


    if(!MyFile.open(QFile::ReadOnly | QFile::Text))
    {
    qDebug() << "could not open file for reading";
    return;
    }


    در قسمت بعد من برای اینکه بتونم با یک فایل متنی و رشته ای کار کنم که میتونه خواندن یا نوشتن باشه باید از کلاس QTextStream یه نمونه ای داشته باشم وظیفه این کلاس ارائه یک رابط مناسب برای خواندن و نوشتن در فایل هستنش به صورت زیر :


    QTextStream in(&MyFile);


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


    QString MyText = in.readAll();


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


    qDebug() << MyText;

    MyFile.close();


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


    Read("C:/TEST/test.txt");


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

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


    #include <QCoreApplication>
    #include <QDebug>
    #include <QFile>
    #include <QString>
    #include <QTextStream>

    void Read(QString Filename)
    {
    QFile MyFile(Filename);

    if(!MyFile.open(QFile::ReadOnly | QFile::Text))
    {
    qDebug() << "could not open file for reading";
    return;
    }

    QTextStream in(&MyFile);
    QString MyText = in.readAll();

    qDebug() << MyText;

    MyFile.close();
    }


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

    Read("C:/TEST/test.txt");

    return a.exec();
    }


  17. #17

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله یازدهم : معرفی و کار با فایل ها / خواندن و نوشتن در آن ها

    در این قسمت میریم سراغ کار با فایل ها در C++‎‎‎‎/Qt و نوشتن در داخل فایل (Write)

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



    #include <QFile>

    #include <QString>

    #include <QTextStream>



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


    void Write(QString Filename)
    {
    QFile MyFile(Filename);

    if(!MyFile.open(QFile::WriteOnly | QFile::Text))
    {
    qDebug() << "could not open file for reading";
    return;
    }

    QTextStream out(&MyFile);
    out << "Hello my friend :D";
    std::cout << "The text is written!";

    MyFile.flush();
    MyFile.close();
    }


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


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

    Write("C:/TEST/test.txt");

    return a.exec();
    }



    خروجی شد به صورت زیر هر چیزی که در داخل فایل هستش :


    The text is written!


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


    Hello my friend :D


    حالا بریم سراغ توضیحات.... در مرحله اول در رابطه با تابع Write توضیح بدم....
    من ابتدا برای نوشتن و یا خواندن در داخل یک فایل باید از کلاس QFile یک نمونه بگیرم تا بتونم این کار رو انجام بدم پس به صورت زیر ابتدا یه نمونه گرفتم :



    QFile MyFile(Filename);


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

    به صورت زیر :


    if(!MyFile.open(QFile::WriteOnly | QFile::Text))
    {
    qDebug() << "could not open file for writing";
    return;
    }



    در قسمت بعد من برای اینکه بتونم با یک فایل متنی و رشته ای کار کنم که میتونه خواندن یا نوشتن باشه باید از کلاس QTextStream یه نمونه ای داشته باشم وظیفه این کلاس ارائه یک رابط مناسب برای خواندن و نوشتن در فایل هستنش به صورت زیر :




    QTextStream out(&MyFile);


    حالا در قسمت بعد میگم متن مورد نظر رو در داخل فایل من بنویس به صورت زیر :



    out << "Hello my friend :D";



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


    out << "Hello my friend :D";
    std::cout << "The text is written!";

    MyFile.flush();
    MyFile.close();



    قبل از بستن فایل گفتم که هرگونه متنی رو که در فایل میخوای بنویسی قبلش در حافظه Buffer قرار بده در این صورت مقدار 1 رو برام بازگشت میده و فایل رو میبنده در غیر اینصورت 0 و خطا !

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



    Write("C:/TEST/test.txt");



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

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


    #include <QCoreApplication>
    #include <QDebug>
    #include <QFile>
    #include <QString>
    #include <QTextStream>

    void Write(QString Filename)
    {
    QFile MyFile(Filename);

    if(!MyFile.open(QFile::WriteOnly | QFile::Text))
    {
    qDebug() << "could not open file for reading";
    return;
    }

    QTextStream out(&MyFile);
    out << "Hello my friend :D";
    std::cout << "The text is written!";

    MyFile.flush();
    MyFile.close();
    }


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

    Write("C:/TEST/test.txt");

    return a.exec();
    }


  18. #18

    Smile نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله دوازدهم : معرفی و کار با برچسب ها Label

    با سلام ؛

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

    اسم این لیبل بهص ورت پیشفرض label هست شما میتونید در قسمت objectName اسمش رو تغییر بدین.

    من لیبلم رو قرار دادم ولی حالا میخوام متن لیبل رو بر اساس سلیقه تغییر بدم در محیط طراحی شما میتونید با دوباره کلیک روی متن پیشفرض لیبل اون رو تغییر بدین و یا اینکه از قسمت Property خاصیت Text رو تغییر بدین به صورت زیر :


    که در این حالت شما میتونید امکان تغییر فونت رو در سریعترین حالت در دست داشته باشید و همچنین سورس HTML رو در اختیار داشته باشید به صورت زیر :


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


    ui->label->setText("<b>Hello</b> , My name is Kambiz");


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

    هر چند در حالت دستی قابلیت ویرایش و استایل بندی سریع در اختیار گذاشته میشه ولی برای استایل نویسی همانطور که قبلا گفتم میتونید از قابلیت HTML و CSS استفاده کنید.

    کد کلی :


    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    ui->label->setText("<b>Hello</b> , My name is Kambiz");

    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }



    خروجی به صورت زیر :

    آخرین ویرایش به وسیله کامبیز اسدزاده : سه شنبه 08 بهمن 1392 در 14:56 عصر

  19. #19

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله سیزدهم : معرفی و کار با Button

    در رابطه با Button باید بگم یکی از پر کاربرد ترین شیئ هایی هستش که ازش استفاده خواهد شد و مخصوصا رخداد Event در حالت کلیک شدن به صورت زیر پروژه رو ایجاد و از QPushButton استفاده می کنیم.
    از قسمت WidgetBox دکمه مورد نظر رو انتقال میدیم به صورت زیر:



    mybutton-1.jpg

    در این مرحله با کلیک راست روی دکمه و انتخاب گزینه مشخص شده Got to slot میتونیم رخداد مورد نظر رو برای دکمه در نظر بگیریم

    mybutton-2.jpg

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

    mybutton-3.jpg
    بعد از انجام این مراحل تابع مربوط به این رخداد برای این شناسه از دکمه ایجاد می شود و شما میتوانید کد مورد نظرتون رو برای این رخداد از کلیک بنویسید.

    mybutton-4.jpg

    من کد زیر رو برای نمایش ی پیغام وارد میکنم تا با کلیک شدن روی دکمه پیغام نمایش داده بشه.


    QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.exec();
    فایل های ضمیمه فایل های ضمیمه

  20. #20

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله چهاردهم : معرفی و کار با LineEdit

    کنترل LineEdit همان کنترل TextBox معروف هستش که وظیفه این گرفتن اطلاعات از کاربر هست Property های زیادی هم داره و همینطور رویداد های مختلف.

    آبجکتم رو ایجاد میکنم روی فرم و بعد یه دکمه میزارم و میخوام با کلیک روی دکمه متنی رو که تو LineEdit مینویسم نمایش بدم.
    قبل از هر چیز هم نام آبجکتم رو عوض میکنم میزارمش MyLineEdit به صورت زیر ...


    حالا میرم سراغ کد نویسی ... مستقیم میرم تو رویداد کلیک دکمم مینویسم کد زیر رو...



    QMessageBox msgBox;
    msgBox.setText(ui->MylineEdit->text());
    msgBox.exec();


    با این تفاوت که به جای پیغام قبلی خاصیت متن موجود در LineEdit رو فراخوانی میکنم با دستور زیر :


    ui->MylineEdit->text();


    این به این معنیه که متن موجود در شیئ کادر ورودی متن من رو بگیر.

    نتیجه شد به صورت زیر :



    فایل های ضمیمه فایل های ضمیمه

  21. #21

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله پانزدهم : معرفی و کار با CheckBox

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

    حالا من به صورت زیر چک باکسمو میارم روی فرم و میخوام با کلیک بر روی دکمه اگه CheckBox من تیک خورده باشه بهم پیغام بده که تیک خورده یا متن مورد نظرم رو نمایش بده یا اگر تیک نخورده باشه بهم بگه که اقا تیک نخورده انتخابش کن ! یا هر چیزی که خوشتون میاد.


    و کد زیر در رویداد دکمه من :


    if (ui->checkCPP->isChecked())
    {
    QMessageBox msgBox;
    msgBox.setText("C++‎‎‎‎");
    msgBox.exec();
    }
    else {
    QMessageBox msgBox;
    msgBox.setText("Please select your programming language !");
    msgBox.exec();
    }



    به جای این متن ها میتونید متن خود CheckBox رو هم بگیرید. به ورت زیر :


    msgBox.setText(ui->checkCPP->text());


    و در نهایت نتیجه به صورت زیر هستش :

    در صورتی که تیک نخورده باشه نتیجه زیر :

    در صورتی که تیک خورده باشه به صورت زیر :

  22. #22

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله شانزدهم : معرفی و کار با RadioBox


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


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

    حالا من میخوام وقتی فرمم بود میشه یکی از این دو کنترل به صورت پیشفرض مقدار دهی بشه که مقدار برابر این کنترل ها همیشه true یا false خواهد بود یعنی در حالت انتخاب true و در غیر اینصورت false.

    در قسمت فرم لود من کد زیر رو مینویسم.


    ui->radioYES->setChecked(true);


    گزینه ui که کلا مربوط به فرم طرحمون هستش یعنی ui و بعد هر شیئی که روی اون قرار داره.
    اسم و یا شناسه کنترل رو مینویسم و بعد مقدار true رو براش در نظر میگیرم تا وقتی فرمم لود شد رادیویی که Yes هست در حالت انتخاب قرار بگیره اگه این کارو انجام ندم هیچ یک از این کنترل ها مقدار دهی نخواهند شد یا باید اینجوری توسطز کد مقدار اولیه برای یکی از این دوتا بدیم یا باید از قسمت properties مشخص کنیم که معمولا هیچوقت هردو باهم انتخاب نخواهند شد !!! فقط یکی از این دو قابل انتخاب هست وقتی دیگری رو انتخاب کنید گزینه بعدیش از حالت true به حالت false مقدار دهی میشه.

    نتیجه فرم لود به صورت زیر :

    و اما الان میخوام در رویئداد کلیک دکمه خودم کدی بنویسم که وقتی Yes انتخاب شد یه پیغام و وقتی No انتخاب شد یه پیغام یا هرچیزی که مد نظرمون باشه رو برامون بده.


    void MainWindow::on_pushButton_clicked()
    {


    if (ui->radioYES->isChecked() == true)
    {
    QMessageBox msgBox;
    msgBox.setText("Yes ! I like C++‎ programming languge! that's powerfull and faster than ever !");
    msgBox.exec();
    }
    else if (ui->radioNO->isChecked() == true)
    {


    QMessageBox msgBox;
    msgBox.setText("No ! I don't like C++‎ !");
    msgBox.exec();
    }


    }


    این قسمت من میتونستم مشخص کنم که اگه RadioYes مقدارش true بود فلان کار و اگر مقدارش false بود فلان کار ولی خب خواستم از مقدار موجود در RadioNo هم استفاده کنم در کل میشه از هر دو حالت هم استفاده کرد بنا بر سلیقه خودتون... !

    نتیجه به صورت زیر خواهد بود :

    radio3.jpgradio4.jpg
    فایل های ضمیمه فایل های ضمیمه

  23. #23

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله هفدهم : معرفی و کار با ComboBox

    و اما کار با ComboBox به صورت زیر آبجکت رو انتخاب و نام گذاری میکنم...


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


    /*Data*/
    QStringList Language = (QStringList() << "English" << "Perisan" << "Turkish" << "Russian");
    ui->ComboLang->addItems(Language);


    خب به این قسمت دقت کنید بر اساس خاصیت مقدار دهی شده در این کنترل یک نوع جدید از نوع QStrinList با نام Language در نظر گرفتم و بعد مقادیر مورد نظرم رو در داخل این لیست توسط عملگر درج >> وارد کردم در خط بعدی توسط addItems که نوع آرایه ای یا لیست های خاص رو میگیره توسط Language وارد میکنم.

    نتیجه باید به صورت زیر باشه :

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


    QString CurrentVal;
    CurrentVal = ui->ComboLang->currentText();


    QMessageBox msgBox;
    msgBox.setText(CurrentVal);
    msgBox.exec();


    خب ابتدا چیکار کردم یه نوع متنی تعریف میکنم و بعد چون از نوع متن برگشتی یعنی CurrentText میخوام استفاده کنم نوع رشتم رو معرفی کردم و بعد مقدار این متغیرم رو برابر مقدار متن انتخاب شده COmboBox خودم قرار میدم و نتیجه میشه به صورت زیر :


    برای مقداری از نوع int هم میتونید متغیر خودتون رو از نوه int تعریف کرده و مقدار CurrentIndex رو بهش اختصاص بدین و کلی کارای دیگه ...
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : سه شنبه 23 اردیبهشت 1393 در 13:12 عصر

  24. #24

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله هجدهم : معرفی و کار با ListWidget

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

    به صورت زیر ایجادش میکنیم و در فرم لود همانند ComboBox ایتم های مورد نظر رو بهش میدیم.




    /*Data*/
    QStringList C_Types = (QStringList() << "C++‎‎‎‎ Native" << "C++‎‎‎‎ CLI/.Net" << "C++‎‎‎‎ MFC" << "C++‎‎‎‎ Win32");
    ui->listWidget->addItems(C_Types);


    حالا میخوام مقدار انتخاب شده رو نمایش بدم که یکمی متفاوتر از ComboBox خواهد بود به صورت زیر :


    QString Val;
    Val = ui->listWidget->currentItem()->text();
    QMessageBox msgBox;
    msgBox.setText(Val);
    msgBox.exec();


    خب متغیرم رو در نظر میگیرم و بعد برابرش میکنم با متن مقدار آیتم انتخاب شده در لیست باکسم !
    و در نهایت مقدار تبدیل شده به رشته رو میفرستم به MSG.

    نتیجه به صورت زیر :
    فایل های ضمیمه فایل های ضمیمه

  25. #25

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله نوزدهم : معرفی و کار با TreeWidget

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

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

    در رابطه با این شیئ باید اینمطور توضیح داد که خاصیت والد و فرزند رو در خودش تخصیص داده است برای مثال من نمونه زیر رو بخوام روی این لیست نمایش بدم به صورت زیر :

    کتاب C++‎‎‎‎‎ 11
    • فصل اول
    • فصل دوم
    • و ....


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

    حالا روشی که من میخوام برای این بکار ببرم به صورت زیر خواهد بود ابتدا برای دسترسی و راحتی کار 2 تا تابع تعریف میکنم برای parent و child

    در قسمت mainwindow.h پایینتر از Q_OBJECT


    void AddRoot(QString name, QString Discreption);
    void AddChild(QTreeWidgetItem * parent, QString name, QString Discreption);


    خب اینجا من متد ها و همچنین نام و نوع تابع رو مشخص کردم که برای AddRoot یا همان والد نام و توضیحلات رو در نظر میگیرم و برای AddChild یا همان فرزند علاوه بر نام و توضیحات هر یک شناسه تعیین کننده برای شناساندن ایتم مورد نظر برای سر شاخه هستش و اونم از نوع QTreeWidgetItem قرار میدم.

    مرحله بعد در فایل اصلیمون mainwindow.cpp توابع رو صدا زده و بدنه توابع رو میسازم به صورت زیر :


    void MainWindow::AddRoot(QString name, QString Discreption)
    {




    }


    void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
    {






    }


    حالا من به کد های زیر در داخل هریک از این دو تابع نیاز دارم به صورت زیر :


    void MainWindow::AddRoot(QString name, QString Discreption)
    {


    QTreeWidgetItem * MyItem = new QTreeWidgetItem(ui->MyTreeWidget);


    MyItem->setText(0, name);
    MyItem->setText(1, Discreption);
    ui->MyTreeWidget->addTopLevelItem(MyItem);


    AddChild(MyItem, "C++‎‎‎‎‎", "Native / Objective");
    AddChild(MyItem, "Java", "Objective");


    }


    void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
    {


    QTreeWidgetItem * MyItem = new QTreeWidgetItem();
    MyItem->setText(0, name);
    MyItem->setText(1, Discreption);
    parent->addChild(MyItem);






    }


    در تابع اول AddRoot ابتدا یک کپی از QTreeWidgetItem میسازم تا به عنوان آیتم های درختی برام کار کنه و در مرحله بعدی گفتم که در ایندکس اول یعنی 0 متنی رو که تابع میگیره رو ست کن و در خط بعدیش دقیقا مثل این گفتم توضیحات رو در ایندکس 1 یعنی دوم این رو ست کن و بعد از این گفتم لیست درختی من این دو گزینه رو از نوع آیتم های سر شاخه قرار بده با کد : addTopLevelItem این کار رو انجام میدم.
    در خط بعدش اومدم گفتم ایتم های AddChild برابر باشه از آیتم های تعریف شده به صورت بالا که از تابع AddChild فراخوانی میشوند به صورت زیر ...

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

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


    ui->MyTreeWidget->setColumnCount(2);
    AddRoot("Language", "Features");


    مشخصه که گفتم دو ستون از نوع زبان و ویژگی های زبان درج کن و بعد از این تابع Addroot فراخوانی شده و تابع AddChild همینطور و نتیجه میشه به صورت زیر...

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

  26. #26

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیستم : معرفی و کار با Action ها

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

    چکار باید انجام بدم ... خیلی راحت روی فرمم قسمت منو روی Type Here کلیک میکنم و اسم منورو مینویسم مثل تصویر زیر...

    توجه کنید که هر والد میتونه زیر شاخه های خودش رو داشته باشه همچنین میتونید با کلیک روی Add Separator خط فاصلخ بین منوها به عنوان جدا کننده ایجاد کنید.

    هریک از منو هایی که ایجاد میشه به عنوان یک Action هستش مثل دیگر کنترل های دارای Event ها و Slot های خاص خودشون هستند. حالا برای اینکه مثلا با کلیک کردن رو دکمه Exit یا همون منوی ساخته شده با نام Exit یه کاری انجام بدیم چکار باید کنیم ؟ خب باید در رخداد کلیک شدن یا انتخاب شدن این Action که در اینجا با شناسه actionExit در دسترس هستش وارد بشم و کدهای مورد نظر رو برای انجام کار مورد نظر بنویسیم به صورت زیر قسمت اکش ها و استلات ها مشخص هست :



    در ادامه خیلی راحت با وارد شدن به اسلات مورد نظر و ایجاد تابع رخداد triggered مراحل زیر رو ادامه میدیم...


    void MainWindow::on_actionExit_triggered()
    {


    }




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


    QApplication::exit();


    و در نهایت با کلیک بر روی منو اکشن Exit برنامه باید از پروسه خارج شود.
    فایل های ضمیمه فایل های ضمیمه

  27. #27

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و یکم : معرفی و کار با Progress و Slider ها

    در رابطه با کنترل های progress و Slider چون پراپرتی های تقریبا مشابهی دارند این دو رو باهم ادغام میکنیم به صورت زیر روی فرمم یک Progressbar و یک Slider ایجاد میکنم.


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

    به صورت زیر میتونید تنظیماتش رو اختصاص بدین ...

    حالا میاییم سراغ کد نویسی... قبل از هر چیز شناسه Progresbar من هستش MyprogressBar و شناسه Slider من هستش MyhorizontalSlider
    میخوام دقیقا وقتی مقدار Sliderbar تغییر میکنه مقدار Progressbar هم بر اساس اون تغییر کنه به چه روشی میشه این کار رو انجام داد ؟!

    در Qt ما بحث Signal و Slot هارو داریم که به طور خلاصه بخوام خیلی ساده توضیح بدم این خواهد بود : فرض کنید من یه یک شخصی ایمیل میزنم و در قبال اون ایمیل انتظار دریافت جوابش رو دارم حالا من اینجا به عنوان Signal و شخص دریافت کننده ایمیل من هستش Slot و ارتباط بین این دو مورد توسط چه چیزی انجام پذیره ؟ تابعی داریم به نام connect که وظیفه این تابع برقراری ارتباط باین Signal و Slot هستش به صورت زیر عمل خواهیم کرد :

    این کد من هست :


    connect(ui->MyhorizontalSlider, SIGNAL(valueChanged(int)), ui->MyprogressBar, SLOT(setValue(int)));


    در این کد من تابع connect رو فراخوانی کردم این تابع ابتدا Signal رو میگیره ور بعد Slot رو برای سیگنالی که ارسال کرده ستش میکنه خیلی راحت بخواه ساده تر بگم وظیفش همینیه که میبینید سیگنال رو ارسال میکنه و اسلات رو برای سیگنال ارسال شده دریافت میکنه حالا اینجا مقدار ارزشی که ما ارسال میکنیم و دریافت میکنیم از نوع int هستش که در هر دو شیئ ما مقدار value ارسال و دریافت میشه.

    حالا بعد از اجرا کردن برنامه هر بار من مقدار Slider رو تغییر بدم مقدار Progressbar هم تغییر خواهد یافت به صورت زیر :


    خب این یه خلاصه ای از مفهوم سیگنال و اسلات بین این دو کنترل یکم توضیح بدم در رابطه با ست کردن جداگانه مقدار در کنترل Progressbar
    برای این کار از پراپرتی setValue باید استفاده کنیم من برای مثال چهار مقدار متفاورت رو با استفاده از کنترل Button ایجاد و ارسال میکنم به صورت زیر :


    ui->MyprogressBar->setValue(75);


    این کد مقدار 75 رو از 100 درصد ظرفیت progressbar ارسال میکنه.


    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : چهارشنبه 24 اردیبهشت 1393 در 15:32 عصر

  28. #28

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و دوم : معرفی و کار با Statusbar ها

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


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

    ابتدا یک نوع label میسازم :


    QLabel *Mylbl = new QLabel();
    Mylbl->setText("Welcome to C++‎ Qt Designer tutorial");


    خب حالا برای اینکه این برچسب ایجاد شده رو روی Statusbar نمایش بدم باید به صورت زیر عمل کنم :


    ui->statusBar->addWidget(Mylbl);


    خیلی ساده و راحت با یه دستور addWidget از Statusbar آبجکت Label رو بهش اصافه میکنم و نتیجه میشه به صورت زیر :

    فایل های ضمیمه فایل های ضمیمه

  29. #29

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و سوم: معرفی و کار با MessageBox

    خب یکی از مواردی که خیلی پر کاربرد هستش مخصوصا برای نمایش پیغام های خاص مثل (اخطار / اطلاعات / سوال و جواب و ...) استفاده از MessageBox هستش که در C++‎ در حالت های مختلفی میشه ازش استفاده کرد و من در این آموزش برای Qt این مثال رو تقریبا سعی میکنم کامل بزنم تا بهتر و مفیدتر باشه.

    برای اینکه در برنامتون از MessageBox استفاده کنید ابتدای فایلتون بایت این کلاس رو فراخوانی کنید : QMessageBox

    به صورت زیر :


    #include "QMessageBox"


    خب حالا من میتونم از این کلاس استفاده کنم ابتدا ازش یه شیئ جدید میسازم :


    QMessageBox MyMSG;
    MyMSG.setText("Welcome to C++‎ Tutorial :)");
    MyMSG.exec();



    در خط اول از کلاس QMessageBox یک نمونه ساختم و در خط دوم متنی رو درون این آبجکت وارد کردم و در خط بعدی از متد exec برای نمایش Dialog برای پیغام استفاده کردم که نتیجش باید باشه به صورت زیر :


    خب حالا من قصد دارم یکمی پیشرفته تر کار کنم با مواردی که میشه در این کلاس ازشون بهرهمند شد آشنا میشیم ... برای مثال من میخوام از این قابلیت برای پرسش سوال استفاده کنم و نتیجش رو با استفاده از Yes یا No مشخص کنم به صورت زیر کد رو مینویسم :


    QMessageBox msgBox;
    msgBox.setText("Welcome to C++‎ Tutorial");
    msgBox.setInformativeText("Do you want to save your changes?");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();


    خب خط اول و دوم که مشخصه و در خط سوم متنی رو برای نمایش به عنوان سوال پرسی توسط پراپرتی setInformativeText ارسال میکنم در خط بعدیش توسط پراپرتی setStandardButtons دکمه هایی رو که میخوام کاربر هنگام سوال پرسی ببینه رو مشخص میکنم که در اینجا سه گزینه Save / Cancel / Discard رو من انتخاب میکنم و در خط بعد مشخص کردم که دکمه Save به عنوان دکمه پیشفرض در حالت انتخاب شده قرار بگیره.
    و در نهایت پیغام رو نمایش میدم و مقدار بازگشتی حاصل از انتخاب کاربر رو به متغیر ret که از نوع int هستش ارسال میکنم.

    به صورت زیر نمایش داده خواهد شد :

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


    switch (ret) {
    case QMessageBox::Save:
    // Save was clicked
    break;
    case QMessageBox::Discard:
    // Don't Save was clicked
    break;
    case QMessageBox::Cancel:
    // Cancel was clicked
    break;
    default:
    // should never be reached
    break;
    }


    دستور Switch یکی از دستورات معروفی هست که در مواقع پیچیده تر و چند گزینه ای تر بهتر جواب میده.
    طرز کارش چطوریه ؟ خب متغیر ret که داشتیم اون بالا هر دکمه ای رو که ما انتخاب کنیم توسط دستور switch ارزیابی میشه و نتیجه بر اساس سلیقه مشخص خواهد شد.

    مثلا من در مثالی که زدم به صورت زیر هر انتخابی پیغامش رو ارسال خواهد کرد به یک Label که روی فرمم هست.


    switch (ret) {
    case QMessageBox::Save:
    // Save was clicked
    ui->MyLabel->setText("Save");
    break;
    case QMessageBox::Discard:
    // Don't Save was clicked
    ui->MyLabel->setText("Discard");


    break;
    case QMessageBox::Cancel:
    // Cancel was clicked
    ui->MyLabel->setText("Cancel");


    break;
    default:
    // should never be reached
    break;
    }


    یه Property مهم دیگه ای هم داریم به عنوان ICON که برای این کار هم به صورت زیر عمل کنید :


    msgBox.setIcon(QMessageBox::Question);


    نتیجش میشه به صورت زیر :
    فایل های ضمیمه فایل های ضمیمه

  30. #30

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و چهارم: معرفی و کار با Timer / QTimer

    در باره Timer هم همونطور که میدونید یکی از مواردی هستش که در ساده ترین حالت میشه ازش ساعت کنونی سیستم رو گرفت و تغییر ساعت / دقیقه / ثانیه رو به صورت Update نمایش داد. برای این کار ما میتونیم کلاس کامل و جامعی رو برای یک Timer اختصاصی در برنامه بنویسیم که بر اساس Signal و Slot های تعریف شده ازش استفاده کرد.

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

    ابتدا کلاس QTimer رو صدا میزنم :


    #include <QTimer>


    در فرم لود کد زیر رو مینویسم :


    //Start to get System time.


    QTimer *timer = new QTimer(this);
    timer->setInterval(1000);
    timer->start();
    connect(timer, SIGNAL(timeout()),
    SLOT(updateClock()));



    در این کد من ابتدا یک نوع کپی از تایمر یعنی QTimer ایجاد میکنم در خط بعدی مقدار 1000 میلی ثانیه یا همون 1 ثانیه رو بهش میدم در خط سوم استارت میزنم و در خط بعدی از تابع connect برای ارسال Signal و دریافت جواب از طرف Slot رو مینویسم که برای ایجاد اسلات نیاز دارم یه تابعی به نام updateClock که زمان سیستم رو برای من بگیره و برگشت بده.

    در فایل mainwindow.h اسلات (Slot) مربوط به این تابع رو معرفی میکنم به صورت زیر :


    //System Clock update
    private slots:
    void updateClock();


    نوع تابع رو از نوع تابع با دسترسی private به عنوان Slot در نظر میگیرم.

    حالا بر میگردم فایل mainwindow.cpp و تابع رو مینویسم به صورت زیر :


    void MainWindow::updateClock()
    {
    QString timeString = QTime::currentTime().toString("hh:mm:ss");
    ui->LCurrenTtime->setText(timeString);
    }


    خب اینجا من بدنه تابع رو تشکیل میدم و یک متغیری از نوع رشته QString ایجاد کرده و بعد توسط تابع موجود در کلاس QTime دقت کنید این QTime هستش با QTimer فرق میکنه به این r توجه کنید !!! وظیفه این کلاس برگشت دادن زمان جاری سیستم هست که توسط مقدار بازگشتی ثابت (Static) به صورت currentTime رو وارد متغیرم از نوع رشته میکنم البته قبلش تبدیل به رشته میشه و توسط الگوی : hh:mm:ss ساعت : دقیقه : ثانیه ارسال میشه به داخل متغیر.

    در خط بعدی هم که مشخصه مقدار متن label موجود روی فرمم رو که اسمش رو LCurrenTtime گذاشتم برابر میکنم با متغیری که زمان جاری سیستم در اون ذخیره میشه.
    فقط یه نکته که باید برای استفاده از QTime هم کلاسش رو وارد فایل مکنید به صورت زیر و نتیجه نهایی...


    #include "QTime"


    به همین راحتی و شیرینی...
    فایل های ضمیمه فایل های ضمیمه

  31. #31

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و پنجم : معرفی و کار با Thread ها

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

    به طور کلی در نظر بگیرید یک دستگاه های صوتی یا نوار های ویدئویی قدیمی رو که از فناوری Caset استفاده میکنند در این حالت شما وقتی موزیک یا فیلمی رو تماشا میکنید اگه بین فیلم کنونی نیاز داشته باشید تا چند ترک از اون رو به جلو بدین و چند فیلم دیگه رو ببینید مجبور هستید تا اون فیلم رو بیخیال بشید و حالت Seek رو انجام بدین یعنی بکشیدش جلو تا به فیلم مورد نظرتون برسید در این حالت عمل ترتیبی برای رسیدن به هدف صورت گرفته یجور جستجوی ترتیبی برای رسیدن به هدف و اجرای اون هستش حالا ما وقتی پشت کامپیوتر میشینیم و انتطار داریم وارد سیستم عامل که شدیم چندین کار رو هم زمان انجام بدیم برای مثال من مایلم یه طرف برنامه کامپایل کنم یه طرف موزیکمو گوش بدم یه طرفم برنامه های Messenger آنلاین کنم و ... دیگه اینجا هیچ کس حال و حوصله اینو نداره بیاد بشینه دونه دونه کار کنه مثلا اول پیغام بده منتظر بشه تموم شه و بعد بره برنامشو کامپایل کنه و بعد از اون هم تازه بیاد موزیک مورد علاقشو Play کنه و گوش بده ! این ک نشد زندگی عزیز من برای همینم ما بحث Thread رو میاریم وسط که تمام این وظایف رو توسط این مورد حلش میکنیم.

    حالا برای شروع کار من در مثالی که آموزش خواهم داد دقیقا توضیح میدم که چی به چیه ولی سرعت کامپیوتر ها انقدر زیاده که این پروسه ها در background صورت میگیرند و شما احساس نخواهید کرد که کدوم Thread کی و چه زمانی اجرا شد ! ولی نتیجه ای که خواهید دید اینه که مواردی که درخواست پردازش فرستادیم به CPU همشون در حال اجرا هستند چون در کل CPU بر اساس Thread ها برنامه هارو اولویت بندی میکنه برای مثال به پروسه های زیر دقت کنید :

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


    خب حالا یه بحث دیگه برای روشنتر کردن یکی دیگه از فواید Thread ها ... به طور کلی هرکدوم از برنامه های در حال اجرا بر اساس اولویت بندی Thread اون برنامه در اختیار CPU قرار میگیره یعنی اگر اولویت برنامه Visual Studio من بیشتر از برنامه مثلا Qt Creator من باشه و در این صورت اگر همزمان روی هر دوتای اینها برنامه ای رو کامپایل کنم اونی که اولویت پردازش روش بالاتر هست سریعتر و ابتدا در اختیار پردازش برای CPU ارسال میشود که اینم یکی دیگه از فواید Thread هستش پس ببینید خیلی مهمه در برنامه هایی که پر از شرایط تو در تو و توابع اجرایی دائما در حال اجرا هستن از Thread ها استفاده کنیم.

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

    ادامه در پست بعدی...
    آخرین ویرایش به وسیله کامبیز اسدزاده : پنج شنبه 25 اردیبهشت 1393 در 12:53 عصر

  32. #32

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله بیست و پنجم : معرفی و کار با Thread ها

    خب برای شروع این کار بهتر است یک کلاسی ایجاد کنیم ابتدا یک پروژه از نوع QConsole Application و بعد به صورت زیر روی پروژه راست کلیک کنید و Add new و بعد قسمت C++‎‎‎‎‎‎‎‎ گزینه C++‎‎‎‎‎‎‎‎ Class رو انتخاب میکنیم به صورت زیر و ادامه آن ....


    حالا اطلاعات کلاس رو میدیم به صورت زیر ... نامش رو میزرم MyThread

    و ادامه میدیم تا کلاس ما با نام MyThread همراه با فایل های MyThread.h و MyThread.cpp ایجاد بشه.

    فایل هیدر من شد به صورت زیر :


    #ifndef MYTHREAD_H
    #define MYTHREAD_H


    class MyThread
    {
    public:
    MyThread();
    };


    #endif // MYTHREAD_H





    و اینم از فایل .cpp


    #include "mythread.h"
    MyThread::MyThread()
    {


    }




    کلاس من اسمش هست MyThread از نوع public ولی من برای شروع کار با کلاس های Thread به کلاس Thread نیاز دارم باید به صورت زیر فراخوانیش کنم :


    #include <QThread>


    و بعد کلاسم رو به طور کلی و عمومی از نوع یک کلاس Thread مشخص کنم به صورت زیر کلاسم رو تغییر میدم :


    class MyThread : public QThread
    {
    public:
    MyThread();


    //Function run
    void Run();


    };



    هم نوع کلاس رو از نوع Thread مشخص کردم و همینطور یک تابع برای اجرای Thread نوشتم.
    همه این کارها در فایل .h یعنی هیدر کلاس MyThread بود. حالا من بدنه تابع خودم رو در فایل .cpp میسازم به صورت زیر :


    void MyThread::Run()
    {
    qDebug() << "My Thread is running !";
    }


    صدا زدن تابع برگرفته شده از کلاس MyThread و ایجاد بدنه تابع با محتویات چاپ این برنامه در حال اجرا می باشد !
    البته اگه از qDebug استفاده میکنید بهتره کلاس qDebug رو هم فراخوانی کنید.یا اینکه با std::cout هم میتونید این کار رو انجام بدین.


    حالا برای اینکه ببینیم این تابع ساده که کارش عمل چاپ یک متن ساده هست توسط کلاس های Thread کار میکنه یا نه به صورت زیر در فایل main ابتدا فایل mythread.h رو فراخوانی کنید :


    #include "mythread.h"



    حالا ازش یک کپی میگیرم و تابع Run رو صدا میزنم.


    MyThread iThread;
    iThread.start();


    کد کلی این بخش :


    #include <QCoreApplication>
    #include "mythread.h"


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


    MyThread iThread;
    iThread.start();


    return a.exec();
    }




    خروجی میشه به صورت زیر :
    ادامه در پست بعدی...
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : چهارشنبه 24 اردیبهشت 1393 در 19:36 عصر

  33. #33

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله بیست و پنجم : معرفی و کار با Thread ها

    خب در این مرحله از کار میخوام چند تا پروسه ایجاد کنم که توسط Thread به CPU ارسال بشه چطوری ؟ به صورت زیر ادامه میدم مطلبو...
    برای کلاسم در فایل mythread.h یک متغیر از نوع QString تعریف میکنم به صورت زیر :


    QString Value;


    در قسمت بعدی فایل .cpp به صورت زیر دیباگ رو. تغییر میدم :


    cout << this->Value.toStdString() << "Thread is running !" << endl;




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


    MyThread iTH1;
    MyThread iTH2;
    MyThread iTH3;


    iTH1.Value = "T1";
    iTH2.Value = "T2";
    iTH3.Value = "T3";


    iTH1.start();
    iTH2.start();
    iTH3.start();


    خب نتیجه میشه به صورت زیر :

  34. #34

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    ادامه مرحله بیست و پنجم : معرفی و کار با Thread ها

    خب تقریبا مفهوم Thread ها مشخص شد حالا من میخوام یک تابع رو وارد Thread کنم یه چیز خاص و سنگینی به ذهنم نمیرسه که هنگ کنه ولی فرض کنید اگر من تابع تایمر رو توسط Thread فراخوانی کنم و ازش استفاده کنم چی میشه ؟ فرض کنید هر تابع دیگری که نوشتین و کار اون تابع بارگزاری یا مثلا وصل شدن به یه سرور و آپلود کردن یه چیزی هستش اونوقت 100% بدون چونو چرا برنامتون هنگام اجرای همون تابع هنگ میکنه برای اینکه از مشکل هنگ کردن خلاص بشیم بازهم چاره کار استفاده از Thread هست ما با استفاده از این کلاس تابعی که لازمه اجرا بشه رو به داخل Thread ارسال میکنم تا حین اجرا توسط Thread به CPU برای پردازش ارسال شود.

    به صورت زیر من روی همون پروژه Timer کار میکنم ولی اینبار حرکتش میدم داخل یک Thread

    اول از همه کلاس Thread رو داخل همون فایل MainWindow.cpp فراخوانی میکنم :


    #include "QThread"


    کد زیر در داخل فرم لود در همون پروژه Timer با تغییرات زیر :


    //Start to get System time.
    QTimer *timer = new QTimer(this);
    timer->setInterval(1000);
    QThread * iTH = new QThread;
    timer->moveToThread(iTH);
    timer->start();
    connect(timer, SIGNAL(timeout()), SLOT(updateClock()));
    iTH->start();


    در خط چهارم یکئ نمونه از Thread درست کردم :


    QThread * iTH = new QThread;


    در خط بعدی توسط کد زیر Timer رو ارسال کردم داخل Thread


    timer->moveToThread(iTH);



    و در خط آخر Thread رو اجرا کردم با دستور زیر :


    iTH->start();


    حالا این برنامه هنگام اجرا وارد Thread میشه و مشکل هنگ کردن پیش نخواهد آمد.

    به همین سادگی ! در حالی که در دات نت هزارو یک تا کار خود من انجام دادم تا همین تایمر من هنگامی که پینگ میگرفتم به درستی بدون هنگ کردن کار کنه ! ولی اینجا جمعا 3 خط کد برای خود Thread ننوشتیم.
    فایل های ضمیمه فایل های ضمیمه

  35. #35

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و ششم: معرفی و کار با QMap

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


    QMap<Key, T>


    برای تعریف کردن این الگو نوع کلاس QMap و بعد کلید و بعد رشته مورد نظر , در کد زیر من عناوینی رو تعریف کردم که هر کدام برابر است با کلید های اختصاصی :

    اول از همه کلاس QMap رو فراخوانی میکنم :


    #include <QMap>



    QMap<int, QString> Languages;


    Languages.insert(1, "C++‎‎‎‎‎‎‎‎‎‎ ");
    Languages.insert(2, "Java ");
    Languages.insert(3, "PHP ");
    Languages.insert(4, "C#‎‎‎‎‎‎‎‎‎‎ ");
    Languages.insert(5, "VB.NET ");


    foreach(int i, Languages.keys())


    {
    qDebug() << Languages[i];
    }


    حالا در خط اول کلاس QMap رو صدا میزنم و ازش یک کپی میگیرم با شناسه از نوع int و قالب آن از نوع رشته و بعد توسط تابع insert کلید و رشته رو وارد میکنم و در نهایت توسط foreach کلید ها و رشته هارو باهم چاپ میکنم نتیجه میشه به صورت زیر :

    خب حالا میریم سراغ فراخوانی کلید ها همراه با رشته های خودشون به صورت زیر کد رو مینویسیم :


    QMapIterator<int, QString> ILTH(Languages);
    while (ILTH.hasNext())
    {
    ILTH.next();
    qDebug() << ILTH.value() << " Key is = " << ILTH.key();


    }


    اینجا من نیاز به کلاس تکرار کننده یعنی QMapIterator دارم که توسط این مقادیر و کلید های اون رو دریافت و چاپ میکنم و نتیجه به صورت زیر خواهد بود....

    کد نهایی :


    QMap<int, QString> Languages;


    Languages.insert(1, "C++‎‎‎‎‎‎‎‎ ");
    Languages.insert(2, "Java ");
    Languages.insert(3, "PHP ");
    Languages.insert(4, "C#‎‎‎‎‎‎‎‎ ");
    Languages.insert(5, "VB.NET ");


    foreach(int i, Languages.keys())


    {
    qDebug() << Languages[i];
    }




    QMapIterator<int, QString> ILTH(Languages);
    while (ILTH.hasNext())
    {
    ILTH.next();
    qDebug() << ILTH.value() << " Key is = " << ILTH.key();


    }


    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : چهارشنبه 24 اردیبهشت 1393 در 23:38 عصر

  36. #36

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و هفتم : معرفی و کار با QHash

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



    • قابلیت جستجو و دسترسی بسیار سریعتر را نسبت به QMap دارد.
    • در صورتی که لیست تعریف شده حاوی اطلاعات بسیار زیادی باشد در QMap لیست های رشته ای بر اساس کلید های تعریف شده مرتب می شوند ولی در QHash به صورت خودکار تمامی لیست ها بدون قاعده کلیدی مرتب می گردند.
    • و تفاوت جزئی در نوع کلید های این دو کلاس که با عملگر های > و == مشخص است.


    برای استفاده کلاس QHash رو وارد میکنیم ...


    #include <QHash>



    بقیه مراحل همانند QMap...


    QHash<int, QString> Languages;


    Languages.insert(1, "C++‎‎‎‎ ");
    Languages.insert(2, "Java ");
    Languages.insert(3, "PHP ");
    Languages.insert(4, "C#‎‎‎‎ ");
    Languages.insert(5, "VB.NET ");


    foreach(int i, Languages.keys())


    {
    qDebug() << Languages[i];
    }




    QHashIterator<int, QString> ILTH(Languages);
    while (ILTH.hasNext())
    {
    ILTH.next();
    qDebug() << ILTH.value() << " Key is = " << ILTH.key();


    }

  37. #37

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و هشتم : معرفی و کار با QStringList

    این کلاس از رشته ها امکان ایجاد لیستی از رشته هارو در اختیار ما میگذارد برای مثال اگر بخواهیم متغیری تعریف کنیم که حروف الفبا رو برامون به ترتیب نشون بده از این کلاس میتونیم کمک بگیریم.

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


    #include <QStringList>


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


    QStringList MyList;
    QString MyLine = "A,B,C,D,E,F,G";
    MyList = MyLine.split(",");


    foreach(QString Item, MyList)
    {


    qDebug() << Item;
    }



    در خط بعدی متغیری که از نوع QStringList مشخص کردم رو مقداردهی میکنم و در حین مقدار دهی توسط split محتویات رشته رو جدا گانه در داخل MyList قرار میدم و بعد توسط دستور foreach متغیری رو به عنوان آیتم از نوع رشته در نظر گرفته و چاپ میکنم و نتیجه به صورت زیر خواهد بود ...


    "A"
    "B"
    "C"
    "D"
    "E"
    "F"
    "G"


    یا مثلا من میخوام مقدار حرف C رو برابر با C++‎‎‎‎ تغییرش بدم یعنی حرف C رو با C++‎‎‎‎ جایگزین کنم به راحتی توسط دستور زیر :


    MyList.replaceInStrings("C", "C++‎‎‎‎");


    کد کلی :


    QStringList MyList;
    QString MyLine = "A,B,C,D,E,F,G";
    MyList = MyLine.split(",");


    MyList.replaceInStrings("C", "C++‎‎‎‎");


    foreach(QString Item, MyList)
    {


    qDebug() << Item;
    }


    نتیجه :


    "A"
    "B"
    "C++‎‎‎‎"
    "D"
    "E"
    "F"
    "G"
    فایل های ضمیمه فایل های ضمیمه

  38. #38

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و نهم: معرفی و کار با الگوریتم های مرتب سازی

    همونطور که میدونید در C++‎‎‎‎ الگوریتم های مرتب سازی متفاوتی وجود داره که در این میان Qt در کلاس های خودش الگوریتم های مرتب سازی خودش رو ارائه داده... که یکی از ساده ترین اینها تابع qSort هستش.
    برای مثال من اعداد زیر رو که به صورت زیر اومده میخوام مرتب کنم :



    4
    8
    2
    1
    6
    3


    خب کد رو به صورت زیر مینویسیم...


    QList<int> MyList;


    MyList << 4 << 8 << 2 << 1 << 6 << 3;
    qSort(MyList);


    foreach(int i, MyList) {


    qDebug() << i;
    }


    در خط اول متغیر رو از نوع لیست در نظر گرفتم و در خط بعدی اون مقادیرم رو وارد لیستم کردم و در خط بعدی اون توسط تابع qSort مقادیر رو مرتب میکنم و بعد توسط foreach و qDebug چاپش میکنم.

    نتیجه شد به صورت زیر :


    1
    2
    3
    4
    6
    8
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : پنج شنبه 25 اردیبهشت 1393 در 01:48 صبح

  39. #39

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله سی ام : معرفی و کار با الگوریتم های جستجو کننده

    یکی از مواردی که به درد میخوره الگوریتم جستجو هست که در اینجا توسط تابع qFind میتونیم به راجتی مقدار مورد نظر رو در صورت وجود در لیست داده ها پیدا کنیم.
    به صورت زیر کد رو مینویسیم :


    QList<int> MyList;
    MyList << 12 << 0 << 133 << 64 << 512 << 128;
    QList<int>::const_iterator MyIterator = qFind(MyList.begin(), MyList.end(), 64);


    if (MyIterator != MyList.end())
    {


    qDebug() << "Found = " << *MyIterator;


    }


    else


    {


    qDebug() << "Not found!";




    }


    ابتدا متغیرم رو از نوع یک نوع لیست عددی در نظر میگیرم و در خط بعد مقادیر مورد نظرم رو وارد لیست میکنم.
    حالا در خط بعدی عمل جستجو یعنی توسط یک لیست جدیدی از اعداد ایجاد کرده و توسط تابع
    qFind مقدار 64 رو از نقطه آغاز مقادیر موجود در لیست تا انتهای اون رو بررسی میکنم.
    در خط بعدی یک دستور شرطی برعکس آوردم که در اینجا مشخص کردم اگر مقدار مورد نظر من در لیست موجود بود پیغام Found رو همراه با مقدار یافت شده چاپ کن در غیر اینصورت پیغام Not found رو چاپ خواهد کرد و در نهایت نتیجه به صورت زیر خواهد بود ...


    Found = 64

  40. #40

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله سی یکم : معرفی و کار ToolTip

    ToolTip ها چی هستن و به چه دردی میخورن ؟ در کل بیشترین کاربرد این مورد در هنگام Mouse Hover بر روی اشیاء موجود روی رابط کاربری و فرم های شماست که برای استفاده از این امکانات به روش های زیر عمل خواهیم کرد...

    در این بخش من میخوام یک استایل زیبا همراه با متن مورد نظر برای ToolTip کنترلم روی فرم اختصاص بدم توسط دستور setStyleSheet میتوننم استالم رو بر اساس کد های CSS به شیئ مورد نظرم اختصاص بدم.
    و توسط پراپرتی
    setToolTip میتونم محتویان ToolTip رو به کنترلم اختصاص بدم به صورت زیر...

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


    ui->MyButton->setStyleSheet(" QToolTip{text-align:left;color: #ffffff;background-color: #006700;font-family: Tahoma ,'PT Sans', 'Helvetica', arial, serif; border: 2px solid #d5def2;padding: 2px;opacity: 200;}");
    ui->MyButton->setToolTip("<br><font color='#C90'><b>C++‎‎‎‎‎‎‎‎‎‎</b></font><br>Welcome to C++‎‎‎‎‎‎‎‎‎‎ Qt Tutorial!");



    نتیجش وقتی ماوس رو روی کنترل میبریم میشه طرح زیر :

    اصلا نمیخوام آموزش CSS بدم چون واقعا حالشو ندارم ولی باید به یه نکته مهمی اشاره کنم که وقتی استایلی رو روی کنترل یا فرمتون ست میکنید حتما تخصیصش بدین به هدفی که دارید ! مثلا من در استایل این بخش گفتم QToolTip{} و هر کدی که داخلش بنویسم مختص ToolTip خواهد بود در غیر اینصورت اگر بدون مشخص کردن آبجکت های مورد نظرتون استایلی رو اختصاص بدین در آن صورت همه قسمت های کنترل از استایل شما ارث خواهند برد.


    یه توضیحی بدم در رابطه با طرح و استایل این مورد که تمامی اینها مربوطه به کدهای CSS اگه اشخاصی که در طراحی وب و کار با CSS مهارت و تجربه کافی دارن میدونن که چه کارهایی میشه کرد با این CSS !!!
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : پنج شنبه 25 اردیبهشت 1393 در 01:38 صبح

صفحه 1 از 2 12 آخرآخر

تاپیک های مشابه

  1. آموزش Crystal Report (به صورت حرفه ای کار کنید)
    نوشته شده توسط In_Chan_Nafar در بخش گزارش سازی با Crystal Report
    پاسخ: 27
    آخرین پست: جمعه 29 فروردین 1393, 11:54 صبح
  2. آموزش: آموزش برنامه نویسی به زبان اسمبلی به صورت گام به گام
    نوشته شده توسط JaVa در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 8
    آخرین پست: سه شنبه 08 بهمن 1392, 09:19 صبح
  3. سری آموزش ado.net به صورت فایل word
    نوشته شده توسط zarrin_306 در بخش VB.NET
    پاسخ: 7
    آخرین پست: چهارشنبه 06 آبان 1388, 17:35 عصر
  4. آموزش Intraweb به صورت گام به گام
    نوشته شده توسط حمیدرضاصادقیان در بخش توسعه نرم افزار تحت وب
    پاسخ: 3
    آخرین پست: دوشنبه 03 تیر 1387, 21:07 عصر
  5. آموزش گام به گام کار با پلت کامپوننتهای دلفی
    نوشته شده توسط nasr در بخش برنامه نویسی در Delphi
    پاسخ: 15
    آخرین پست: شنبه 30 خرداد 1383, 18:36 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •