تازه های سایت
کانکت کردن سنتی را فراموش کنید !

کانکت کردن سنتی را فراموش کنید !

سلام دوستان

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

این تابع ( تابع connect ) عضو استاتیک کلاس QObject بود ( و هست !) که پارامتر اولش اشاره گر به فرستنده سیگنال. پارامتر دومش سیگنالی که قراره بهش کانکت بشیم. پارامتر سومش گیرنده و پارامتر چهارم اسلاتی که میخوایم با emit شدن signal فراخوانی بشه. جالبه که بدونید ماکرو های SIGNAL و SLOT ورودی خودشون رو تبدیل به رشته میکنن و واسه تابع connect میفرستند واسه همینه که تابع connect داخل Assistant این شکلیه :

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

خب دیگه میتونید به جای استفاده از ماکرو های SIGNAL , SLOT از اشاره گر به توابع (عضو کلاس) استفاده کنید. نکته جالبتر ! لازم نیست لزوما ! updateValue یه اسلات باشه . یا لازم نیست که اصن یه تابع عضو کلاس باشه! (عهههه) بذارید مثال بزنم.

فرض کنید من یه کلاس MainWindow دارم به این صورت : ( لزومی نداره کلاس حتما از جنس QMainWindow باشه فقط باید دقت کنید که کلاسی میتونه سیگنال و اسلات داشته باشه که از جنس QObject باشه یعنی از این کلاس ارث برده باشه مث QMainWindow یا QWidget )

همونطور که از کد برمیاد من یه سیگنال تعریف کردم به نام mySignal1 و بعدشم یه اسلات به نام mySlot1 و البته اسلاتی که با کلیک شدن یه دکمه روی MainWindow صدا زده میشه. یه تابع معمولی هم عضو کلاس دارم به نام myMemberFunction1 که همه پارامترشون یه int هستش.

خب تا اینجای کار که مثل قبل بود. بریم سراغ فایل .cpp

خب توی اول فایل من یه تابع تعریف کردم به نام myFunction که عضو هیچ کلاسی نیست. توی سازنده کلاس MainWindow سه خط مهم هستند :

این خط سیگنال mySignal1 رو به اسلات mySlot1 وصل میکنه. (کاری که قبلا هم میتونستیم با connect معمولی بکنیم )

این خط سیگنال mySignal1 رو به یه تابع عضو کلاس MainWindow به نام myMemberFunction1 وصل میکنه.

و این خط هم که سیگنال mySignal1 رو به تابع myFunction وصل میکنه که عضو هیچ کلاسی نیست.

جالب شد !

حالا کافیه یه دکمه روی فرمتون بذارید و توی اسلات کلیک شدنش سیگنال mySignal1 رو امیت کنید :

حالا اگه کد رو اجرا کنید خروجی شما همچین چیزی باید باشه :

 امکان خطایابی در زمان کامپایل

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

مثلا myMemberFunction1 رو به صورت زیر تغییر بدین :

یعنی پارامتر ورودی اش رو به QString تغییر بدین. و سعی کنید برنامه رو کامپایل کنید. نمیشه !

error: C2338: Signal and slot arguments are not compatible.

ویژگی مهم دیگه این نوع شیوه کانکت کردن امکان استفاده از Lambda expressions هاست که جز امکانات جدید C++11 است. در قسمت بعدی به این مطلب می پردازیم. 

۷,۰۱۴ total views, 1 views today

Print Friendly
Facebook0Google+0Twitter0LinkedIn0

درباره‌ی سعید دادخواه

یه برنامه نویس !

۱۷ نظر

  1. دیگه باید انگار بالاخره یحتمل اگه خدا بخواد ان شاالله برم سراغ کیوت ۵

  2. ۱-    تشکر

    ۲-    کار درست­ها دارن برای فوق آماده می­شن!!!

    ۳-    دانستن این تغییرات و روش­های جدید بسیار سودمند است. یادمه یه اشاره­ای به آوردن این گونه از مطالب زمانی که یک نوع کانکت جدید در قسمت پاسخ به سوالات دیده بودم، مطرح کرده بودم.

    ۴-    خیلی جالب بود، یعنی میتونیم به هر تابع کلاس دیگر متصل شویم؟! خیلی چیزهای دیگه که همیشه برایم عجیب بود که چرا این کار را نکردند، هنوز پا برجا هستند! یه بار برای مثال اگه یادتون باشه در مورد بحث thread، آقای usefulfriend اشاره کردم!

    ۵-     اومدم بگم که گویا ذکر آدرس myFunction را فراموش کردید که دیدم گویا در connect ها نیز بعضی جاها آورده شده و بعض جاها نه، یا شاید من اشتباه می­کنم!

    ۶-    فکر کنم مقدار برگشتی connect، bool باشد، که در connect دوم، اینطور نیست، یا شاید من اشتباه می­کنم.

    ۷-    نمی­دانم چرا با اپرا، textbox های بخش ورود فعال نمیشود! و کناری­ها هم به پایین می­روند!!

    ۸-    آقایون کارشون درسته، نسخه­ی من ۴٫۷ هست!!!

    ۹- آقا به خاطر تنبلی دیر نظر دادیما و گرنه همون موقعا خوندیما! (شاعر معاصر!)

    ۱۰- باز هم بسیار تشکر

     

    • ۱-خواهش میکنم

      ۲-:P کار درست ها ؟! دعا کنید کارمون درست شه !

      ۳-بله بله اصن از اون روز که گفتی یه بخشی از دلم هی داشت عذاب وژدان ! میکشید (من هنوز دقیقا نمیدونم کجا عذاب وجدان میکشه )

      ۴-آره منم واسم سوال بود ! وقتی شما اشاره گر به تابع ارسال میکنید که دیگه فرقی نداره.

      ۵- نه دیگه. myFunction بدون پرانتز حاوی آدرس تابع هستش. ولی برای اینکه آدرس یه تابع عضو کلاس رو بدست بیاریم باید از Class::Method & استفاده کنیم. یعنی اگه تابعی عضو کلاسی نباشه برای بدست آوردن آدرسش نیازی به & نیست.

      ۶-توی Assistant که همه bool هستند. باید چک کنم !

      ۷-باید چک کنم ! D:

      8-علی علی با توعه!

      ۹- 🙂 ) شما فقط حضورت رو مرتب اعلام کن.

    • اوه اپرا چه پیشرفت کرده. عصر دایال آپ من فقط از اپرا استفاده میکردم 🙂 .
      قسمت ورود توی اپرا مشکلی نداره؟

جوابی بنویسید

ایمیل شما نشر نخواهد شد.خانه های ضروری نشانه گذاری شده است. *

*


3 × = شش