رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

سید محمد عباسی

کاربـــر عـــــادی
  • تعداد ارسال ها

    25
  • تاریخ عضویت

  • روز های برد

    7

آخرین بار برد سید محمد عباسی در 12 مرداد

سید محمد عباسی یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

19 بسیار خوب

درباره سید محمد عباسی

توسعه‌ دهنده بَک اِند
توسعه‌ دهنده فرانت اِند
  • تاریخ تولد تعیین نشده

موقعیت

  • شهر
    استان اصفهان_شهرستان فلاورجان

آخرین بازدید کنندگان نمایه

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

  1. سید محمد عباسی

    ممنونم از مطالبتون ، شاید سخت بیاد که شریک داشته باشی ولی توانایی لازم رو نداشته باشه و یا اصلا در حین کار جا بزنه که دیگه من نیستم! بهتر نیست تنهایی فعلا کار رو پیش ببرم ؟ و البته به این نکته رو فراموش نمی‌کنم که هر چقدر محصول نهاییم ناقص باشه باید قبل از اینکه ارتباط رو با مشتری از دست بدم محصول رو ارائه بدم تا بازخورد‌هارو دریافت کنم .
  2. سید محمد عباسی

    با سلام و عرض ادب خدمت دوستان آی او استریمی عزیز ، امیدوارم که هر کجای ایران زمین هستید پیروز و سربلند باشید . با جلسه دوم از آموزش کتابخانه‌ی SIGIL در خدمت شما عزیزان هستم . در این جلسه و چند جلسهٔ آینده به معرفی توابع کاربردی این کتابخانه می‌پردازم و از هر کدام هم مثالی برای شما ‌‎هم ارائه خواهم داد که کامل APIهای این کتابخانه را درک و یاد بگیرید . دقت داشته باشید این کتابخانه مناسب برای کارهای کوچک گرافیکی و حتی پروژهای دانشجویی نیز می‌باشد و در نهایت سادگی می‌توانید از آن استفاده کنید در نهایت برای اطمینان از صحت مطالب در آخر فایلی را ضمیمه خواهم کرد که به شرح هر یک از توابع این کتابخانه پرداخته است ، پس با من در ادامه همراه باشید . توابعی که در این جلسه به آن‌ها پرداخته می‌شود در زیر مشاهده می‌کنید . توابع مربوط به بخش پنجره ( Window ) slWindow slClose slShouldClose توابع مربوط به بخش ورودی ( Input ) slGetKey slGetMousetButton slGetMouseX slGetMouseY توابع مربوط به بخش رندر ( Rendering ) slRender توابع تا همین‌جا باشند که توضیحات درمورد هر کدام کمی زیاد است و حوصله‌سربر که در واقع با زیاد شدن توضیحات حوصله شما هم سرریز می‌کند و خسته می‌شوید که از خواندن ادامه‌ی آموزش صرف‌نظر می‌کنید . پس بی معطلی برویم سر اصل مطلب! از توابع مربوط به بخش پنجره شروع می‌کنیم ، جایی که شما با در دست داشتن توابع ذکر شده می‌توانید به ایجاد پنجره ، بستن پنجره ، و واکنش به بستن پنجره اقدام کنید . slWindow : این تابع با داشتن چهار آرگومان ورودی باعث ایجاد یک پنجره می‌شود، شما می‌توانید به دادن چهار آرگومان ورودی که شامل عرض ( Width ) ، ارتفاع ( Height ) ، عنوان پنجره ( Title ) و تنظیم اینکه پنجره تمام صفحه ( FullScreen ) باشد یا به اندازه‎هایی که در دو آرگومان ورودی یعنی عرض و ارتفاع مشخص کردید نمایش داده شود . همچنین شما می‌توانید از مقادیر بولین که شامل True ( درست ) و یا False ( غلط ) در آرگومان آخر که مشخص کننده‎ی نمایش تمام صفحه و یا نمایش به صورت اندازه‌های دلخواه که مشخص کردید ، استفاده کنید ، بدین صورت که اگر از مقدار True استفاده کنید پنجره صرف‌نظر از اینکه چه مقدارهایی برای عرض و ارتفاع مشخص کردید به حالت تمام صفحه به نمایش در خواهد آمد و اگر از مقدار False استفاده کنید در اندازه‌های دلخواه که در همان آرگومان‌های اول مشخص کردید نمایش داده می‌شود . slClose : اگر از این تابع انتظار دارید که فقط باعث بستن پنچره شود ، کاملا در اشتباهید! چرا که بدون این تابع هم پنجره به خوبی و خوشی بسته می‌شود! اما پس این تابع این وسط چه کاری می‌کند ؟ در حقیقت این تابع وظیفهٔ نابودسازی کامل پنجره را از حافظه بر عهده دارد ، بدین صورت که هنگامی که پنجره ایجاد می‌شود فضایی معین از حافظه را می‌گیرد و بدین ترتیب وظیفه‌ی بازگرداندن حافظه‌ی اشغال شده بر عهده‌ی ماست که این کار توسط تابع slClose انجام می‌شود . این تابع هیج آرگومان ورودی دریافت نمی‌کند و پنجر‌ه‌ی جاری را از حافظه آزاد و نابود می‌کند . slShouldClose : اگر اقدام به ایجاد پنجره کردیم و به هر روشی پنجره را بستیم این تابع فعال شده و مقداری غیر صفر به ما بر می‌گرداند ، کاربرد این تابع توی شروط هستش که می‌توان چک کرد که کاربر پنجره را بسته است یا نه ؟ که در حالت عادی مقدار برگشتی 0 است این یعنی هنوز کاربر اقدام به بستن پنجره نکرده است و در غیر اینصورت اگر کاربر پنجره را ببندد مقدار برگشتی 1 است . در تصویر زیر همان‌طور که مشاهده می‏‌کنید یک مثال از هر سه تابع آورده شده است که شما هم می‌توانید امتحان کنید و با دستکاری کدها بیشتر این موضوع را درک کنید . نتیجه‌ی اجرای کدهای بالا را در تصویر زیر مشاهده می‌کنید : در اینجا بنده پنجره را بستم تا بتوانید خروجی را ببینید و همان‌طور هم که مشاهده می‌کنید در صورتیکه پنجره در حال نمایش و رندر باشد ( منظور از رندر اشیائی هستند که در پنجره در حال نمایش هستند ) مقدار برگشتی عدد 0 و در غیر اینصورت اگر پنجره بسته شود مقدار برگشتی 1 خواهد بود . با توابع ورودی می‌توانید از کاربر ورودی از صفحه کلید ، مختصات موس ، و کلیک کردن موس را در دست بگیرید و استفاده کنید . slGetKey : با استفاده از این تابع می‌توانید یک کلید از صفحه کلید را در صورتیکه کاربر بر بروی کلید مورد نظر از صفحه کلید کلیک کند را دریافت کنید . نحوه کارکرد این تابع به این صورت است که یک مقدار از مقادیر زیر دریافت کرده و در صورتیکه کاربر بر روی کلید مورد نظر در صفحه کلید کلیک کند 1 برگشت داده می‌شود و در غیر اینصورت 0 . به صورت کاراکتر مانند 'W' دقت کنید حتما باید همان‌طور که در فایل ضمیمه هم اشاره شده است باید کارکتر مورد نظر بزرگ نوشته شود در غیر اینصورت عمل نخواهد کرد . دلیلش هم در کدهای اسکی است که با هم تفاوت دارند . مقدار بصورت عددی باشد مانند 290 که در این تابع حکم کلید F1 را دارد . یا استفاده از ثابت‌های عدد که خود این کتابخانه در نظر گرفته است که لیست این ثابت ها در زیر آمده است . دقت کنید که تعداد کمی از این ثابت‌ها در این کتابخانه تعریف شده‌اند و شما به ناچار باید از روی کد اسکی یا حروف بزرگ به بررسی کلیدها بپردازید . SL_KEY_ESCAPE SL_KEY_ENTER SL_KEY_TAB SL_KEY_BACKSPACE SL_KEY_INSERT SL_KEY_DELETE SL_KEY_RIGHT SL_KEY_LEFT SL_KEY_DOWN SL_KEY_UP SL_KEY_PAGE_UP SL_KEY_PAGE_DOWN SL_KEY_HOME SL_KEY_END SL_KEY_CAPS_LOCK SL_KEY_SCROLL_LOCK SL_KEY_NUM_LOCK SL_KEY_PRINT_SCREEN SL_KEY_PAUSE SL_KEY_F1 SL_KEY_F2 SL_KEY_F3 SL_KEY_F4 SL_KEY_F5 SL_KEY_F6 SL_KEY_F7 SL_KEY_F8 SL_KEY_F9 SL_KEY_F10 SL_KEY_F11 SL_KEY_F12 SL_KEY_F13 SL_KEY_F14 SL_KEY_F15 SL_KEY_F16 SL_KEY_F17 SL_KEY_F18 SL_KEY_F19 SL_KEY_F20 SL_KEY_F21 SL_KEY_F22 SL_KEY_F23 SL_KEY_F24 SL_KEY_F25 SL_KEY_KEYPAD_0 SL_KEY_KEYPAD_1 SL_KEY_KEYPAD_2 SL_KEY_KEYPAD_3 SL_KEY_KEYPAD_4 SL_KEY_KEYPAD_5 SL_KEY_KEYPAD_6 SL_KEY_KEYPAD_7 SL_KEY_KEYPAD_8 SL_KEY_KEYPAD_9 SL_KEY_KEYPAD_DECIMAL SL_KEY_KEYPAD_DIVIDE SL_KEY_KEYPAD_MULTIPLY SL_KEY_KEYPAD_SUBTRACT SL_KEY_KEYPAD_ADD SL_KEY_KEYPAD_ENTER SL_KEY_KEYPAD_EQUAL SL_KEY_LEFT_SHIFT SL_KEY_LEFT_CONTROL SL_KEY_LEFT_ALT SL_KEY_LEFT_SUPER SL_KEY_RIGHT_SHIFT SL_KEY_RIGHT_CONTROL SL_KEY_RIGHT_ALT SL_KEY_RIGHT_SUPERint ببب slGetMousetButton : اگر می‌خواهید به بررسی کلیک شدن یکی از دکمه‌های موس بپردازید باید از این تابع استفاده و یکی از این مقادیر را به عنوان آرگومان در هنگام فراخوانی این تابع وارد کنید. در صورتیکه کاربر دکمه‌ای از موس را کلیک کند و منطبق با ورودی تابع باشد 1 را برگشت می‌دهد و در غیر اینصورت نتیجه 0 خواهد بود . استفاده از مقدار عددی مانند 2 که نشانگر دکمه‌ی سمت راست موس است . استفاده از ثابت‌های عدد تعریف شده در خود این کتابخانه که لیست این ثابت‌ها در زیر آورده شده است . SL_MOUSE_BUTTON_1 SL_MOUSE_BUTTON_2 SL_MOUSE_BUTTON_3 SL_MOUSE_BUTTON_4 SL_MOUSE_BUTTON_5 SL_MOUSE_BUTTON_6 SL_MOUSE_BUTTON_7 SL_MOUSE_BUTTON_LEFT SL_MOUSE_BUTTON_RIGHT SL_MOUSE_BUTTON_MIDDL slGetMouseX : این تابع موقعیت X موس را بر می‌گرداند ، به طور مثال شما در حال تکان دادن موس خود هستید و مشاهده هم می‌کنید که مکان نمای موس در حال حرکت بر روی صحفه نمایش است ، حال برای اینکه بتوانید با استفاده از این کتابخانه موقعیت مکان نمای موس را در جهت X بدست بیاوردید باید از این تابع استفاده کنید . مقدار برگشتی این تابع موقعیت مکان نما در صفحه نمایش است . slGetMouseY : این تابع هم دقیقا مشابه تابع slGetMouseX عمل می‌کند با این تفاوت که در جهت Y موقعیت را بر می‌گرداند . البته بنده در اینجا برای اینکه بهتر متوجه بشوید تمام ورودی‌های ممکن را داده‌ام و شما بهتر است جداگانه آزمایش کنید و نتیجه را ببینید که در این مثال نتیجه به دلیل عدد‌های زیاد قابل تشخیص نیست . و در نهایت تابع بخش رندر که در ادامه به توضیح آن خواهم پرداخت . slRender : این تابع وظیفه رندر ( پردازش اشیا و نمایش آن‌ها در پنجره ) تمام اشیائی که در صحنه حضور دارند را بر عهده دارد ، این اشیا می‌توانند شکل باشند و یا متن و سایر مواردی دیگر که در جلسات بعد به توضیح آنها خواهیم پرداخت . در نهایت بعد از مطالعه این آموزش برای یادگیری بهتر و کامل‌تر به تمرین نیاز دارید ، پس تا می‌توانید تمرین کنید . فایل ضمیمه
  3. سید محمد عباسی

    با سلام بنده هم قبلا مشکل شمارو داشتم تا اینکه یه ویدیو توی یوتیوب دیدم و مشکلم رو کاملا برطرف کرد! به این صورت که در باید ماشین مجازی java رو دانلود کنید البته نسخه‌ی 8 و بعد از خود اندروید استودیو sdk و ndk رو دانلود کنید و توی پوشه‌ی Android باید مسیر‌هارو معرفی کنید ، و بعد یک بار Qt رو مجدد راه‌اندازی کنید . اگر باز با مشکل برخوردید همینجا بگید که یه ویدیو بگیرم همراه با توضیحات لینک بدم و مشکلتون برطرف بشه .
  4. کتابخانه‌ی SIGIL مخفف Sound, Input, and Graphics Integration Library که یک کتابخانه‌ی یکپارچه برای صدا ، ورودی ، و گرافیک است که یک کتابخانه‌ی سبک و ساده است برای کار‌هایی ماننده ساخت بازی 2 بعدی و یا در مقابل پخش صدا که شاید جایگزین خوبی در مقابل با کتاب‌خانه‌های پیچده باشد که روند کار در آن کتابخانه‌ها به مراتب سخت‌تر است ، SIGIL برای کار‌های گرافیکی و رسانه ( فقط پخش صدا ) کاربرد دارد و یک کتابخانه‌ی فرعی است ، توابعی ساده‌تر و قابل درک دارد که به راحتی می‌توانید کارهای گرافیکی و یا رسانه‌ای خود را با این توابع انجام دهید ‌. این کتابخانه کراس پلتفرم است و مستقل از سیستم عامل است ، یعنی اینکه می‌‌توانید این کتابخانه را در هر سیستم عاملی با هر IDE و متناسب با کامپایلر‌ها و رایانه‌هایی که به آنها رزی‌بری پای می‌گویند که در ادامه به معرفی و پشتیبانی از این کتابخانه هستند می‌پردازم ، استفاده کنید . نکته نرم افزارها و یا سیستمی‌هایی که نیاز حتمی به بعضی از کتابخانه‌ها دارند و در واقع وابسته به کتابخانه برای اجرا هستند ، کتابخانه‌ی اصلی و در غیر اینصورت اگر بدون کتابخانه‌ای هم قابل اجرا باشند ، کتابخانه‌ی فرعی گفته می‌شود . لیست کامپایلر‌ها که از این کتابخانه پشتیبانی می‌کنند به شرح زیر است : MinGw32 مخفف Minimalist GNU for Windows که به صورت Native هستند ، یعنی وقتی کدی را ترجمه کردند و آن را به باینری تبدیل کردند ، برنامه فقط در همان سیستم عامل قابل اجراست و در سیستم‌ عامل‌های دیگر باید از کامپایلر‌های دیگر استفاده کرد . MSVC مخفف ++Microsoft Visual C یک IDE برای زبانهای برنامه نویسی C و++ C است ، این ابزار برای نوشتن و اشکال‌زدایی کدهای C , ++C و# C میباشد و تاکنون نسخه‌های مختلفی از آن انتشار داده شده است . فرقی هم نمی‌کند پردازنده در این مورد 32 بیت باشد یا 64 بیت . دقت کنید عزیزان که منظور از 64 بیتی و 32 بیتی بودن این است که در نسخه‌هایی از ویژال استودیو که خود مرجع این کتابخانه معرفی کرده است به این نکته هم اشاره کرده که کتابخانه‌ی شما در این نسخه‌های ویژال استودیو فرقی نمی‌کند که 32 بیتی و یا 64 بیتی کامپایل شود اما در نسخه‌های جدید حتما باید 64 بیتی کامپایل شود در غیر اینصورت با خطا مواجه می‌شوید . Linux GCC که مخفف GNU Compiler Collection است ، مجموعه‌ای از کامپایلر‌های هستند برای زبان‌های برنامه نویسی مختلف که توسط پروژه گِنو به وجود آمدند . رایانه‌ی Raspberry Pi Raspberry Pi که یک قطعه‌ی کوچک از یک رایانه‌ی تک برد است که توسط بنیاد رزی‌بری پای ساخته شده است تا آموزش علوم رایانه را در مدارس و در کشور‌های در حال توسعه گسترش دهد .باید توجه کنید که این یک رایانه است ، کتابخانه‌ی SIGIL می‌تواند در این رایانه هم استفاد شود و کامپایلر نیست . پس متناسب با کامپایلر خود و یا حتی اگر رایانه مبتنی بر Raspberry Pi دارید ، می‌توایند از این کتابخانه استفاده کنید . برای دانلود این کتابخانه ابتدا به این صحفه وارد شوید و در پایان قطعه کدی که مشاهده می‌کنید با توجه به سیستم‌عامل و کامپایلر IDE خودتان نسخه‌ی موجود را دانلود کنید. همچنین اگر مشتاق توسعه این کتابخانه باشید ، سورس کد آن در سرویس گیت‌لب موجود می‌باشد و می‌تواند در توسعه آن همکاری کنید ‌. در پایان پس از دانلود کتابخانه ، روش اضافه کرد کتابخانه به ویژال استودیو که اکثرا از این IDE استفاده می‌کنند شرح می‌دهیم که مرجع این کتابخانه یک IDE دیگر را هم ذکر کرده است و اگر شما عزیزان در IDE دیگری مشغول کد‌نویسی هستید می‌توانید بعد از پایان این جلسه از آموزش در قسمت نظرات IDE خود را معرفی کنید تا روش اضافه کردن این کتابخانه را معرفی کنیم . اضافه کردن کتابخانه به ویژال استودیو بعد از اینکه کتابخانه را دانلود کردید ، به ترتیب تصاویر زیر کتابخانه را به ویژال استودیو اضافه کنید : در قسمت جستجو و با توجه به پارامترهایی که این IDE در اختیار شما گذاشته است می‌توانید سریعتر نوع پروژه‌ای که قصد ساختن آن را دارید مشخص کنید و از اتلاف وقت برای جستجو در بین نوع‌های مختلف پروژه برای پیدا کردن نوع پروژه خود جلوگیری کنید ،‌ در مرحله بعد به شکل زیر عمل کنید : برا برایی دسترسی داشتن به سولوشن از نوار منوی بالا روی view کلیک کنید و Solution Explorer را انتخاب کنید ، می‌بینید که پروژه‌ای که ساختید در سمت راست در قالب یک پنجره نمایان می‌شود در اینجا بر روی پوشه‌ی Source کلیک راست کرده و گزینه Add را انتخاب کنید و درنهایت در زیر منویی که برای شما باز می‌شود گزینه‌ی New Item را انتخاب کنید یک پنجره برای شما باز می‌شود که باید C++ File را انتخاب و در زیر پنجره یک کادر متن دیده می‌شود که باید در آن نام فایل سورس‌کد خود را انتخاب کنید ،‌ دقت داشته باشید که پسوند Cpp را در انتهای نام فایل فراموش نکنید ،‌ طبق تصویر بالا باید یک فایل جدید به ‌پوشه‌ی Source شما اضافه شده باشد ،‌ روی فایل دابل کلیک کرده تا محتویات این فایل در پنجره‌ای که مشاهده می‌کنید ، نمایش داده شود که در حاضر فایل ما خالی است . در قدم بعدی باید کتابخانه را اضافه کنیم ‌ ،‌ پس مطابق تصویر پایین عمل کنید :‌ در اینجا باید حال را روی اجرا بر روی 64 بیتی و همچنین روی حالت دیباگ برای اشکال زدایی در طی برنامه‌ی نوشته شده قرار دهید ،‌ البته اگر به مرجع خود این کتابخانه بروید ، می‌بینید که از نسخه های قبل‌تر چه 32 بیت و چه 64 بیت می‌توانید استفاده کنید! اما در اینجا نسخه‌ی ویژال استودیو بنده 2019 هستش و در این نسخه باید حالت بر روی 64 بیت باشد ،‌ در غیر اینصورت برای اجرای کتابخانه دچار خطا و مشکل می‌شوید ،‌ پس این مورد را هم فراموش نکنید ،‌ در قدم بعدی به شکل زیر عمل می‌کنیم : در اینجا از از نوار منوی بالا رو Project کلیک کرده و در زیر منویی که باز می‌شود ،‌ آخرین گزینه یعنی Properties را انتخاب کنید و در پنجره‌ای که برای شما باز می‌شود طبق شکل روی یک مثلث کوچک که در کنار هر کدام ویژگی‌های مربوطه قرار گرفته کلیک کنید و قدم بعدی که تصویر زیر باشد را انجام دهید :‌ بخشی را در سمت راست مشاهده می‌کنید ، همانطور که در تصویر بالا هم آمده است ، بر روی Additional Include Directories کلیک کنید و یک متن با عنوان Edit برای شما نمایش داده می‌شود که روی آن کلیک کرده تا مطابق تصویر یک پنجره برای شما باز شود ، بر روی پوشه‌ای که در تصویر مشاهده می‌کنید کلیک کرده تا کادر به همراه یک دکمه در سمت راست کادر برای شما نمایش داده شود ،‌ روی دکمه کلیک کرده و مطابق شکل زیر پیش بروید :‌ در اینحا تنها کاری که لازم است انجام دهید به این صورت است که پوشه‌ی include را اانتخاب و روی Select Folder کلیک کنید تا به پروژه اضافه شود ، دقت کنید که اگر پروژه را که قصد ساختن آن را با این کتابخانه دارید می‌خواهید برای کسی بفرستید یا به اشتراک بگذارید باید این دو پوشه و فایل‌های dll که حاصل از استخراج کتابخانه است که دانلود کردید ، باید تمام فایل‌ها و پوشه‌ها را در پوشه‌ی پروژه کپی کنید ،‌ پس به این نکته هم دقت داشته باشید . در قدم بعدی طبق تصویر زیر پیش بروید :‌ وقتی که پوشه‌ی مورد نظر را انتخاب کردید ،‌ باید در قدم نهایی بر روی Ok طبق تصویر بالا کلیک کنید و به مرحله‌ی بعد که در تصویر زیر است بروید : در اینجا و در قدم نهایی برای اضافه کردن کتابخانه ما به سراغ سربرگ Linker می‌رویم و گزینه Input را انتخاب می‌کنیم ،‌ همانطور که مشاهده می‌کنید در سمت راست باید وابستگی‌ها را اضافه کنیم ، پس بر روی Additional Dependencies کلیک کنید و گزینه‌ای با عنوان Edit برای شما نمایان می‌شود که روی آن کلیک کنید تا پنجره‌ای در تصویر زیر برای شما نمایش داده شود :‌ در کادری که مشخص شده است باید فایلی با پسوند lib را که پروژه برای استفاده از کتابخانه به آن وابسته است و حتما باید اضافه شود را وارد کنید که نام این فایل sigil.lib در پوشه‌ی lib است و اگر تمام فایل‌ها و پوشه‌ها را داخل پوشه‌ی پروژه کپی کنیم باید به این شکل این فایب را اضافه کنیم ،‌ در غیر اینصورت باید آدرس کامل به همراه نام فایل مشخص شده را وارد کنید . بعد از اضافه کردن فایل ذکر شده روی Ok کلیک کنید و در قدم بعدی مطابق تصویر زیر عمل کنید :‌ در تصویر بالا ابتدا بر روی Apply کلیک کنید و سپس روی Ok کلیک کنید تا کتابخانه اضافه شود ،‌ دقت داشته باشید اگر فراموش کرده باشید که حالت را روی 64 بیت را دراین نسحه روی نگذارید ،‌ باید تمام مراحل را از اول انجام دهید . و در نهایت کد زیر را برای آزمایش صحیح اضافه کردن کتابخانه بنویسید و اجرا کنید : #include "sl.h" #include <Windows.h> int main() { ShowWindow(GetConsoleWindow(), false); slWindow(600, 500, "Welcome to Sigil", false); while (!slShouldClose() && !slGetKey(SL_KEY_ESCAPE)) { slRender(); } slClose(); return 0; } نتیجه‌ی اجرای کد بالا ایجاد و نمایش یک پنجره با ابعاد مشخص است که می‌توانید در تصویر زیر مشاهده کنید : خب عزیزان به پایان این جلسه از آموزش رسیدیم ، در جلسات بعد به معرفی توابع و کاربرد هر کدام می‌پردازیم و در آخر و پایان آموزش‌ها یک پروژه عملی ساخت یک بازی دو بعدی را پیش می‌بریم . موفق و سربلند باشید .
  5. سید محمد عباسی

    اولین پاراگراف رو که خوندم لذت بردم و پیشاپیش تشکر می‌کنم . ممنون از مقالات خوبتون ❤ .
  6. سید محمد عباسی

    آقای اسدزاده ممنونم ❤ ولی حِسم به مایکروسافت یه جوری شد ☺
  7. سید محمد عباسی

    سلام ۱.Build runqmake.۲
  8. سید محمد عباسی

    سلام با توجه به نوع اپلیکیشنتون که Qt Widgets باشه یا Qt Qtuick باید دیپلوی(deploy) کنید!. اول برای Qt Widgets مَد پروژه رو روی حالت release قرار بدید به این صورت: و با توجه به نوع کامپایلری که استفاده می‌‌کنین، خط فرمان مربوطه رو باز کنید. با دستور windeployqt.exe فایلی اجرایی به همین نام اجرا میشه.برای اینکه بتونید اپلیکیشنتون رو در سایر سیستم‌ها اجرا کنید، از این دستور برای ساخت فایل اجرایی استفاده می‌کنیم. به تصویر زیر دقت کنید: در مرحله‌ی بعد باید مسیر پوشه‌ی release رو بهش بدید به این صورت: اول گفتم برو به پوشه‌ی system32 که توی درایو C و پوشه‌ی Windows هستش. این پوشه‌ وظیفه‌ی اجرا و دسترسی به بعضی از قسمت‌های مختلف ویندوز رو میده!. زیاد راجبش توضیح نمیدم. یکی از این دسترسی‌ها اینکه ما با دستور cd می‌تونیم تغییر مسیر بدیم و از مسیر فعلی بیرون بیایم. مسیر پوشه‌ی release رو بهش میدم و همونطور که می‌بینید، ما در مسیر گفته شده هستیم. در قدم بعدی باید دستور نهایی رو وارد کنید! پس به این صورت: در نهایت dllها و پوشه‌های مورد نیاز اضافه میشن و اپلیکیشن ما ـماده اجرا بر روی سیستم‌های دیگست. و اما Qt Quick فقط یک مرحله هستش!. خط فرمان رو باز کنید(با توجه به نوع کامپایلرتون). و دستورات در تصویر زیر رو وارد کنید: دقت کنید که بعد از اینکه qmldir-- رو نوشتید، باید اول مسیر کل سورس کد رو بدید و بعد مسیر فایل اجرایی که توی پوشه‌ی release هستش(همراه با پسوند مثلا test.exe). در نهایت فایل‌های مورد نیاز اضافه میشن و اپلیکیشن ما آماده استفاده در سایر سیستم‌هاست.
  9. سید محمد عباسی

    سلام شما می‌تونید از، متد sleep از کلاس QThread و حلقه‌ی while استفاده کنید.
  10. سید محمد عباسی

    فرهنگ هم نداریم متاسفانه! اگه اینقدر درک و فهم بالایی داشتیم، صف‌های کیلومتری نمی‌بستیم بخاطر چیز‌هایی که اصلا ارزش خریدن ندارن! البته حق با شماست، و در کل این فقط دردش موبایل نیست که صف ببندیم براش! البته این وسط استارت‌اپ‌هایی که دارن توی‌ این حوضه‌ کار می‌کنن، بد میشه براشون. پ.ن: وقتی می‌گم ارزش خریدن نداره، چون همچین مواقعی باید حتی اگه گوشی هم دستت هست، بری بفروشیش چون دیگه جذابیتی واست نداره. شرکت سازنده داره بهت پشت می‌کنه:).
  11. سید محمد عباسی

    این تحریم، علیه کلیه کاربران ایرانیست. و چیزی جز نارضایتی کاربران به دنبال نخواهد داشت.
  12. در این آموزش با کمک کتابخانه‌ی chilkat که در اینجا معرفی شده است،‌ وارد حساب کاربری خود در iostream می‌شویم!. فرم را می‌توانید به سلیقه‌ی خود طراحی کنید . که فرم ورود به این صورت است. کد: import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 import QtQuick.Dialogs 1.2 import QtQuick.Controls.Material 2.3 ApplicationWindow{ id:window width: 300 height: 350 title: "فرم ورود" visible: true flags: Qt.FramelessWindowHint | Qt.Window x: Screen.width / 2 - width / 2 y: Screen.height / 2 - height / 2 header: Label{ id: header color: "#fff" text: "iostream" font.family: "Times New Roman" font.pointSize: 40 topPadding: -5 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter background: Rectangle{ color: "#23ab85" } } Button { id: close x: 0 y: -6 width: 34 height: 45 icon.name: "close-icon" icon.source: "qrc:/cancel.png" icon.color: "red" highlighted: true Material.accent: Material.shade("#fff",Material.Shade100) onClicked: window.close() } Item { MessageDialog{ id:message title: "خطا" visible: false } anchors.fill: parent TextField { id: email x: 60 y: 30 width: 180 font.pointSize: 15 font.family: "Times New Roman" placeholderText: "نام کاربری یا ایمیل" Material.accent: Material.Green } TextField { id: password x: 60 y: 80 width: 180 font.pointSize: 15 font.family: "Times New Roman" placeholderText: "گذر واژه" Material.accent: Material.Green echoMode: TextField.Password } Button { id: _login x: 55 y: 140 width: 186 height: 50 text: "ورود " highlighted: true font.pointSize: 15 font.family: "Times New Roman" topPadding: 3 Material.accent: Material.shade("#3e4148",Material.Shade500) onClicked: { if(Login.login(email.text,password.text)){ userpanle._url=Login.panle() userpanle.visible=true } else{ message.text="ورود ناموفق بود!" message.visible=true } } } } footer: Label{ text: "جامعه‌ی‌ برنامه‌نویسان مٌدرن ایران" color: "#fff" height: 50 topPadding: -6 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pointSize: 18 font.family: "Times New Roman" background: Rectangle{ color: "#23ab85" } } UserPanle{id: userpanle; visible: false;} } اکنون یک کلاس ایجاد کنید که بتوانیم درخواست‌های خود را ارسال کنیم!. در اینجا کلاس Login و دارای دو متد ‌login و userPanel است. #ifndef LOGIN_H #define LOGIN_H #include <QObject> #include <QDesktopServices> #include <QUrl> #include <CkHttp.h> #include <CkHttpRequest.h> #include <CkHttpResponse.h> class Login : public QObject { Q_OBJECT public: explicit Login(QObject *parent = nullptr); Q_INVOKABLE bool login(const QString & email_username,const QString & password); Q_INVOKABLE QString userPanel(); signals: public slots: private: QString m_finalRedirectUrl; CkHttp m_http; }; #endif // LOGIN_H متد login دو آرگومان ورودی دریافت می‌کند: ۱.نام کاربری یا ایمیل 2. گذرواژه این درمورد بعضی از وبسایت‌ها صدق نمی‌کند!.یعنی علاوه پُر کردن فیلد‌های خواسته شده، فیلد‌های دیگری را هم باید پُر کنید تا به شما اجازه ورود بدهند!. متد دوم مربوط به صحفه‌ای است که ما درخواست کرده‌ایم و نتیجه برگشت داده می‌شود!. در ادامه بیشتر توضیح خواهم داد. تابع login را به این صورت تکمیل می‌کنیم!. #include "login.h" #include <QDebug> Login::Login(QObject *parent) : QObject(parent) { if(m_http.UnlockComponent("30-day trial")!=true) qDebug()<<m_http.lastErrorText(); } bool Login::login(const QString &emailـusername, const QString &password) { m_request.AddParam("auth",emailـusername.toUtf8()); m_request.AddParam("password",password.toUtf8()); m_request.put_Path("/login"); CkHttpResponse* m_response; m_response= m_http.SynchronousRequest("www.iostream.ir",443,true,m_request); if(m_response->get_LastMethodSuccess()!=true) { qDebug()<<m_response->lastErrorText(); return false; } m_finalRedirectUrl= m_response->finalRedirectUrl(); userPanel(); delete m_response; return true; } QString Login::userPanel() { QDesktopServices::openUrl(QUrl(m_finalRedirectUrl)); // return m_finalRedirectUrl; } کلاس CkHttpRequest باید هر بار درخواستی را آماده، و سپس با متد SynchronousRequest از کلاس CkHttp ارسال کند. با استفاده از متد AddParam پارامتر ‌های لازم را اضافه می‌کنیم، مرورگر خود را باز کنید وارد صحفه‌ی ورود به حساب کاربری ‌شوید،‌ بر روی فیلد اول(نام کاربری یا ایمیل) کلیک راست کرده و گزینه Inspect را انتخاب کنید. تگ مربوط به این فیلد نمایش داده می‌شود. <input type="text" placeholder="نام کاربری یا ایمیل" name="auth" id="auth" value="*************"> و فیلد دوم(گذرواژه) هم به همین صورت. <input type="password" placeholder=" گذرواژه" name="password" id="password" value="********"> فرض بر این گرفته می شود شما با HTML آشنایی دارید!. متد AddParam دو ارگومان ورودی دریافت می‌کند: 1.نام فیلد 2.مقدار فیلد به ویژگی نام(name) دقت کنید،‌ با این ویژگی و نامی که برای آن انتخاب می‌کنیم می‌توانیم به مقدار(value) آن دسترسی داشته باشیم! پس ورودی اول متد AddParam برابر با نام فیلد می‌شود(auth) و ورودی دوم هم مقدار فیلد است،‌ که در اینجا مقادیر از پارامتر‌های تابع ‌login دریافت می‌شوند. با متد put_Path مسیر صحفه‌ی مورد نظر را مشخص می‌کنیم، که صحفه‌ی مورد نظر ما ‌login/ است. از کلاس CkHttpResponse برای دریافت پاسخ استفاده می‌کنیم، هنگامی که ما درخواستی را ارسال می‌کنیم، یک پاسخ در قالب یک شئ از کلاس ‌CkHttpResponse برگشت داده می‌شود. پاسخ می‌تواند موفقیت آمیز باشد یا نباشد! که این مورد می‌تواند با متد get_LastMethodSuccess بررسی شود. در نهایت درخواست خود را ارسال می‌کنیم! متد SynchronousRequest چهار آرگومان ورودی دریافت می‌کند: 1.نام میزبان 2.پورت ورودی 3.تایید کردن یا نکردن گواهینامه‌ی ‌ssl 4.درخواستی را که از قبل اماده کرده‌ایم نام میزبان در این مثال www.iostream.ir است. پورت ورودی 443 است که پروتکل ‌HTTPS از ان استفاده می‌کند. می‌توانید تایید کنید که اطلاعات شما بصورت رمزنگاری شده فرستاده شوند یا نه. درخواستی را که از قبل اماده کردیم m_request. با استفاده از متد finalRedirectUrl اخرین صحفه‌ای که کاربر منتقل شده است برگشت داده می‌شود، که در متغییر m_finalRedirectUrl ذخیره خواهد شد. اکنون می توانیم با استفاده از متد openUrl از کلاس QDesktopServices ادرس صحفه‌ی ذخیره شده را در مرورگر باز کنیم!. یا می‌توانید از ‌‌ WebEngineView در ‌qml برای نمایش استفاده کنید. به این صورت: import QtWebEngine 1.7 import QtQuick.Window 2.3 Window{ width: 1000 height: 600 title: "userPanel" visible: true property string _url: "" WebEngineView{ anchors.fill: parent url: _url } }
  13. سید محمد عباسی

    با سلام خدمت شما دوستان، درخدمت شما هستم با آموزش کتابخانه‌ی chilkat، کتابخانه‌ای مفید و کارآمد برای کار با شبکه، که بیشترین تمرکز را در شبکه دارد! به راحتی می‌توانید با این کتابخانه کار کنید. کافیست کمی به زیر و بم این کتابخانه اشنا شوید تا انچه برنامه شما به شبکه نیاز دارد براورده سازد! در این اموزش نحوه اضافه کردن کتابخانه در محیط Qt Creator همراه با یک مثال ساده دانلود فایل را یاد خواهید گرفت. ابتدا نسخه متناسب با کامپایلر خود را از اینجا دانلود کنید و سپس گام به گام این مراحل را انجام دهید. 1.روی پروژه خودتان راست کلیک کنید و گزینه AddLibrary را انتخاب کنید.همانند تصویر زیر: 2.گزینه ExternalLibrary را انتخاب کنید، روی Next کلیک کنید. 3.تیک مربوط به نوع سیستم عامل خود را انتخاب کنید(در این مثال Linux) و فایل libchillat-9.5.0.a را انتخاب کنید، روی Next کلیک کنید. 4.در اینجا با کلیک بر روی Next کتابخانه را به پروژه خود اضافه کنید. 5. برنامه را اجرا کنید. فرم را به سلیقه‌ی خود می‌توانید طراحی کنید. اکنون یک کلاس با نام دلخواه اضافه کنید که در این مثال کلاس download است، ما فقط به یک تابع نیاز خواهیم داشت که ادرس فایل و مکان ذخیره فایل را گرفته و فایل را دانلود کند و در مکان مورد نظر ذخیره کند.پس چیزی شبیه به این را خواهیم داشت! #ifndef DOWNLOAD_H #define DOWNLOAD_H #include <QObject> #include <QFileDialog> #include <CkHttp.h> class Download : public QObject { Q_OBJECT public: explicit Download(QObject *parent = nullptr); Q_INVOKABLE bool donwloadFile(const QString & url); signals: public slots: private: QString m_filePath; bool m_success; CkHttp m_http; }; #endif // DOWNLOAD_H از Q_INVOKABLE به منظور دسترسی متد در فایل qml استفاده می‌کنیم، و از متغیر های m_filePath برای ذخیره مکان و m_success برای دانلود و عدم دانلود! از کلاس CkHttp برای دانلود فایل استفاده خواهیم کرد، این کلاس متد‌‌های مختلفی را فراهم می‌کند، که هر کدام کاربردی دارند! برای دانلود ما از متد Download استفاده می‌کنیم، این متد در صورت موفقیت در دانلود فایل true و عدم دانلود false را برگشت می‌دهد. در فایل cpp به این صورت تابع خود را تکمیل می‌کنیم! #include "download.h" #include <QDebug> Download::Download(QObject *parent) : QObject(parent) { m_success= m_http.UnlockComponent("30-day trial"); if(m_success!=true) qDebug()<<"Not UnlockComponent Error: "<<m_http.lastErrorText(); } bool Download::donwloadFile(const QString &url) { m_filePath=QFileDialog::getSaveFileName(nullptr,"محل ذخیره فایل را انتخاب کنید"); if(m_filePath!="") { m_success= m_http.Download(url.toUtf8(),m_filePath.toUtf8()); if(m_success!=true) { qDebug()<<"Error Download: "<<m_http.lastErrorText(); return false; } qDebug()<<"ContentType: "<<m_http.lastContentType(); return true; } return false; } بعضی از کلاس های این کتابخانه نیاز به مجوز دارند! بدون مجوز نمی‌توان از کلاس ها استفاده کرد! در کانستراکت کلاس ابتدا با متد UnlockComponent به مدت 30 روز رایگان استفاده می‌کنیم(30-day trial). در صورتی که مجوز به ما داده شود متغیر m_success برابر با true خواهد شد، در غیر اینصورت می‌توان با متد lastErrorText خطا ها را مشاهده کرد و نسبت به رفع آن اقدام کرد.با استفاده از متد getSaveFileName از کلاس QFileDialog مکان فایل را در صورت انتخاب در متغیر m_filePath ذخیره می‌کنیم، بعد از انتخاب مکان ذخیره فایل بررسی می‌کنیم متغیر m_filePath خالی نباشد!. متد Download دو ارگومان ورودی دریافت می‌کند! 1.ادرس فایل 2. محل ذخیره فایل در صورتی که فایل با موفقیت دانلود شود با متد lastContentType نوع فایل را نمایش داده می‌شود و فایل در مکانی که از قبل انتخاب کردیم ذخیره می‌شود. به عنوان مثال می‌خواهیم قالب صحفه‌ی نخست iostream را در یک فایل txt ذخیره کنیم! پس به این صورت عمل می‌کنیم.
  14. سید محمد عباسی

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

    توابع Image Filtering شاید در تصویرمان بخواهیم عملیات زوم کردن را انجام دهیم در این صورت ما از توابع pyrUp،pyrDownیا تابع buildPyramid استفاده کنیمکهتابع buildPyramid تا هر چند برابر که بخواهیم تصویر را دور میکند اما بیش از حد ان باعث نابودی پیکسل های تصویر میشود. تابع pyrUp: تصویر را نزدیک میکند(ZoomIn) این تابع الگوریتم متفاوتی دارد و باید طبق این الگوریتم پیش رفت تا مشکلی پیش نیاید الگوریتم این تابع به این صورت است که میگوید شما میخواهید تصویر را دوبرابر کنید پس باید در پارمتر سومی که سایز را از مامیخواهد سطر و ستون تصویر ضرب در2 شود اینگونه سطر و ستون دوبرابر خواهند شد و خروجی مورد نظر را میدهد اما اگر در مقداری به جز مقدار 2 ضرب یا بعلاوه شود در این صورت تصویر انقدر بزرگ میشود که امکان نمایش ان وجود ندارد البته هر چند برای دوبرابر کردن تصویر که سایز ضرب در 2 میشود هم محدودیت وجود دارد و تا حد مشخصی میشود تصویر را نزدیک کرد بعد از ان با خطا مواجه میشویم یک مثال از این تابع را مشاهده کنید: #include <stdio.h> #include <stack> using namespace cv; Mat output_image; Mat image_read; void Zoom_In() { pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2)); imshow("Zoom In", output_image); image_read = output_image; } void Zoom_Out() { pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2)); imshow("Zoom Out", output_image); image_read = output_image; } void ZoomIn_And_ZoomOut(int position, void* user) { std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl; } int main() { void* userdata = (void*)10; TrackbarCallback zoom_in = (TrackbarCallback)Zoom_In; TrackbarCallback zoom_out = (TrackbarCallback)Zoom_Out; image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR); imshow("befor",image_read);//befor filtering ShowWindow(GetConsoleWindow(), SW_HIDE); createTrackbar("TrackBar1", "befor", 0, 10,zoom_in); waitKey(0); } تابع createTrackBar: یک اسلایدربار را به یک پنجره متصل میکند ورودی اول نام اسلایدر بار ورودی دوم نام پنجره برای متصل شدن ورودی سوم حداقل مقدار اسلایدربار ورودی چهارم حداکثر مقدار ورودی پنجم یک رویداد برای اینکه اگر موقعیت اسلایدربار تعغیر کرد چه کاری صورت گیرد که اینجا ما میتوانیم به دو صورت این ورودی را بدهیم با موقعیت و دیتاهای کاربر که باید بصورت اشارگر باشد و در خود تابع به نوع مناسب تبدیل شود یا اینکه یک TrackbarCallback تعریف کرده همونطور که در کد میبینید و تابع را نوشته و تبدیل میکنیم که تابع ما ZoomIn است ورودی اخر این تابع دیتای های کاربر هست که به پارامتر void* user منتقل میشود در تابع ZoomIn دقت کنید که باید بعد از عملیات زوم image_read برابر با output_image قرار بگیرد تا در عملیات بعد سایز image_read که در پارامتر سوم مورد نیاز است برای زوم بعدی مورد استفاده قرار گیرد. حاصل اجرای کد بالا بصورت زیر خواهد بود: تابع pyrDown: برای بتوانیم تصویر رادور کنیم(ZoomOut) از این تابع استفاده میکنیم برای اینکه از سطر و ستون تصویر بکاهیم و تصویر را تا اندازه ی مشخص دور کنیم باید اینجا سطر و ستون تقسیم بر 2 شود که اگر به عنوان مثال ضرب در 2 شود تصویر نزدیک میشود در همان حالت اگر تصویر تقسیم بر 2 شود به حالت اولیه خود برمیگردد یک مثال از این تابع را مشاهده کنید: #include <opencv2\opencv.hpp> #include <Windows.h> #include <iostream> #include <stdio.h> #include <stack> using namespace cv; Mat output_image; Mat image_read; void Zoom_In() { pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2)); imshow("Zoom In", output_image); image_read = output_image; } void Zoom_Out() { pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2)); imshow("Zoom Out", output_image); image_read = output_image; } void ZoomIn_And_ZoomOut(int position, void* user) { std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl; } int main() { void* userdata = (void*)10; TrackbarCallback zoom_in = (TrackbarCallback)Zoom_In; TrackbarCallback zoom_out = (TrackbarCallback)Zoom_Out; image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR); imshow("befor",image_read);//befor filtering ShowWindow(GetConsoleWindow(), SW_HIDE); createTrackbar("TrackBar1", "befor", 0, 10,zoom_in); createTrackbar("TracBar2", "befor", 0, 10, zoom_out); waitKey(0); } حاصل اجرای کد بالا بصورت زیر خواهد بود: تابع buildPyramid: کار تابع pyrDown راانجام میدهد این کار توسط پارامتر سوم صورت میگیرد فقط تنها نکته ای که وجود دارد پارامتر دوم این تابع یک InputOutputOfArray که منظورش یک ورودی و خروجی از ارایه است دریافت می کند یعنی باید یک ارایه ای دریافت کند که ورودی و خروجی ان فقط از همان ارایه باشد در دو تابع ذکر شده ما امدیم وبعد از عملیات تصویر اصلی را برابر تصویر که عملیات روی ان صورت گرفته قرار میدادیم تا در عملیات بعدی نتیجه مطلوب را دریافت کنیم اما در اینجا فقط با دادن مقداری که میخواهیم عملیات ZoomOut را انجام دهیم تصویر را دور میکند یک مثال از این تابع مشاهده کنید: #include <opencv2\opencv.hpp> #include <Windows.h> #include <iostream> #include <stdio.h> #include <stack> using namespace cv; Mat output_image; Mat image_read; /*void Zoom_In() { pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2)); imshow("Zoom In", output_image); image_read = output_image; } void Zoom_Out() { pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2)); imshow("Zoom Out", output_image); image_read = output_image; } void ZoomIn_And_ZoomOut(int position, void* user) { std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl; }*/ int main() { vector<Mat> vecmat; image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR); buildPyramid(image_read, vecmat,4); for (int i = 0; i < vecmat.size(); i++) imshow("ZoomIn"+i, vecmat[i]); ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } دقت کنید که کلاس vector از خود کتابخانه ی OpenCV است و باید از همین کلاس برای این تابع استفاده کنید جز این با خطا مواجه میشوید. حاصل اجرای کد بالا بصورت زیر است:
×
×
  • جدید...