تازه های سایت
تابع connectSlotsByName دوست داشتنی

تابع connectSlotsByName دوست داشتنی

همیشه اولین چیزی که بعد از کیوت خودنمایی میکنه signal ها , slot ها هستند. راههای مختلفی برای اتصال یه سیگنال به یک اسلات وجود داره که شاید ساده ترین راه ( نه لزوما راحتترین ) استفاده از تابع کانکت هستش.

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

مثلا یه راه دیگه اش استفاده از بخش طراحی فرم کریتور هستش. میشه مثلا روی دکمه راست کلیک کرد و بعد Go To Slots رو زد و بعد از انتخاب اسلات مربوطه یه تابعی برای شما ساخته میشه که هر چی توش بنویسید با emit شدن اون سیگنالی که انتخاب کرده بودین اجرا میشه.

slot1

slot2تاحالا به کدی که براتون تولید میشه دقت کردین ( نه خدایی ؟! )

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

اسم اسلات خیلی شبیه قبلیه ! ساختار اسم اسلات به این صورته اول یه کلمه on با _ میاد ! بعدش اسم Object بعدش دوباره یه _  و بعدش اسم سیگنالش. عه !

خب حالا یه کاری بکنید. یه لاین ادیت بذارین روی فرمتون . از پنجره Properties سمت راست یه اسم بهش بدین ( پیش فرض lineEdit ) . آقا Go To Slot رو نزن دیگه عه !

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

و کد زیر رو در فایل .cpp مرتبط قرار بدین :

حالا برنامه رو اجرا کنید. عه ! کد اجرا میشه؟! چی شد؟! ما که هیچ کانکتی انجام ندادیم چرا این دوتا به هم وصل شدند ؟!slot3نکته کار همون تابع connectSlotsByName هستش . حالا این تابع چیکار میکنه؟ تابع به صورت زیره :

زمانی که شما این تابع رو با اشاره گر مثلا به یه QWidget صدا بزنید اتفاقی که می افته اینه که میره و کلیه بچه های اون widget رو میگرده و اگه تونست یه بچه ای پیدا کنه که به اسلاتی که شما تعریف کردین بخوره این دوتا رو به هم وصل میکنه.  ینی چی ؟ ینی اگه مثلا فرم شما یه دکمه داره به نام qtips بعدش شما اومدی و یه اسلات توی کلاست گذاشتی به صورت زیر :

و بعدش تابع connectSlotsByName رو هم صدا زدی کاری که این تابع میکنه اینه که میاد می بینه خب شما یه دکمه داری به نام qtips و در ضمن دکمه هم سیگنالی به نام clicked داره . شمام یه اسلات تعریف کردی که خیلی به اینا میاد ! میاد و خودش سیگنال کلیک شدن دکمه رو به سلات on_qtips_clicked وصل میکنه.

چی شد ؟! فرض کنید شما یه widget دارین به صورت زیر  :

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

حالا اسلات زیر رو به کد اضافه کنید

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

خب حالا کد رو اجرا کنید . بله درسته و پیام نشون داده میشه. راستی اگر در کامپایل به مشکلی برخوردید تعریف توابع بالا رو به فایل .cpp منتقل کنید. ینی سازنده و اسلات رو ببرید داخل فایل .cpp تا درست بشه. آره!

خب حالا این به چه دردی میخوره ؟ توی ویژوال استودیو اگه دقت کرده باشین باید فرماتون رو توی Designer طراحی بکنید چیزی به نام Go To Slot معنی نداره. یکی از راههای بی دردسر طراحی فرم اینکه مثلا دکمه تون رو توی دیزاینر روی فرم بذارید و بعدش بیاین داخل ویژوال استودیو و یه اسلات به فرمتون به فرمت بالا اضافه کنید و نگران کانکت شدن این دوتا نباشه. در ضمن دقت کنید که صدا زدن تابع connectSlotsByName رو یه بار و در جای مناسب انجام بدین. نکته دیگه اینکه اگه فرم + فایل دات اچ ! + فایل دات سی پی پی ! دارین این تابع خودکار صدا زده میشه و نیازی به صدا زدنش نیست ولی اگه خودتون دارین بدون داشتن فایل ui فرم طراحی میکنید حتما صداش بزنید.

۲,۰۱۰ total views, 1 views today

Print Friendly
Facebook0Google+0Twitter0LinkedIn0

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

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

۵ نظر

  1. سلام جناب دادخواه
    امکانش هست در مورد QML توضیح بدید چی هست؟ و به چه دردی می خوره؟ چون تو بعضی جمله ها شما اینو زیاد دیدم
    ممنون

  2. سلام جناب دادخواه
    من شنیدم سیگنال و اسلات تو PHP هم هستند البته من اصلا به این زبون آشنا نیستم.درسته؟؟؟

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

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

*


شش × = 48