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

سلام دوستان

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

این تابع ( تابع 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, 3 views today

Print Friendly, PDF & Email

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

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

همچنین ببینید

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

سلام دوستان. یه خبر خوب!‌ شما می تونید از lambda expressions در connect کیوت استفاده …

17
دیدگاه بگذارید

avatar
2 Comment threads
15 Thread replies
0 دنبال کنندگان
 
Most reacted comment
داغ ترین نخ نظرات
4 کامنت گذاران
علیرضا14alirezaسعید دادخواهعلیرضاعلی رضا پژوهش کامنت گذاران اخیر
  مشترک شو!  
جدیدترین قدیمی‌ترین دارای بیشترین امتیاز
میخوام باخبر شم از
علی رضا پژوهش
Member
علی رضا پژوهش

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

علیرضا
Guest
علیرضا

مگه چنده؟

علی رضا پژوهش
Member
علی رضا پژوهش

۴٫۸٫۵-۱۰

14alireza
ویرایشگر
14alireza

۱-    تشکر ۲-    کار درست­ها دارن برای فوق آماده می­شن!!! ۳-    دانستن این تغییرات و روش­های جدید بسیار سودمند است. یادمه یه اشاره­ای به آوردن این گونه از مطالب زمانی که یک نوع کانکت جدید در قسمت پاسخ به سوالات دیده بودم، مطرح کرده بودم. ۴-    خیلی جالب بود، یعنی میتونیم به هر تابع کلاس دیگر متصل شویم؟! خیلی چیزهای دیگه که همیشه برایم عجیب بود که چرا این کار را نکردند، هنوز پا برجا هستند! یه بار برای مثال اگه یادتون باشه در مورد بحث thread، آقای usefulfriend اشاره کردم! ۵-     اومدم بگم که گویا ذکر آدرس myFunction را… Read more »