تبلیغات
Qt Developer Blog - Events In Qt Part A
 
Qt Developer Blog
کیوتی ساده و آسان برای همه
                                                        
درباره وبلاگ

در این وبلاگ کیوتی که مجموعه ای از کلاس ها برای برنامه نویسی دلپذیر تر با سی پلاس پلاس هست آموزش داده میشود
مدیر وبلاگ : سعید دادخواه
نظرسنجی
آموزش ها به چه صورتی باشد






آمار وبلاگ
  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :
پنجشنبه 10 شهریور 1390 :: نویسنده : سعید دادخواه

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

Events رخدادها
رخدادها یا Event ها چه هستند ؟ سوال مهمی است . برای اینکه بیشتر بفهمیم که رخداد ها چه چیز هایی هستند اجازه بدید بیشتر در مورد اونا بدونیم. البته از دیدگاه ویندوزی !
ببینید برنامه های Consoleای که مینوشتیم راهی نداشتیم که با سیستم عامل ارتباط برقرار کنیم و به همین دلیل مثلا تابعی مثل scanf را برای گرفتن ورودی از کاربر صدا میزدیم. ولی در دنیای سیستم عامل های جدید این طور نیست. شما به واقعیت نزدیک تر میشوید . به چه صورت ؟ بذارید یه مثال بزنم . بچه ها رو دیدید که توی یه مسافرت طولانی آدم رو کلافه میکنن که رسیدیم ، رسیدیم؟ رسیدیم ؟ پس کی میرسیم؟ رسیدیم؟
وای آدم کلافه میشه و با صدای بلند میگیم نه عزیزم وقتی رسیدیم بهت میگم. صدا زدن تابعی مثل scanf مثل بچه ای میبینه که مرتب بگه رسیدیم، رسیدیم؟ بله شاید کاربر ساعت ها دلش نخواد یه مقدار برای برنامه ما ارسال کنه و تابع منتظر ورودی است. ولی در سیستم عامل ویندوز رویه یکمی فرق داره . ویندوز به شما میگه این قدر نگو ورودی ورودی ، هر وقت اومد بهت خبر میدم ! بله ویندوز هر وقت که خبری بشه بهتون پیام میده و خبرتون میکنه از یه واقعه (Event) .
پس یه خبرایی داره میشه ! ویندوز میخواد با شما ارتباط برقرار کنه و این ارتباط از طریق پیام هایی است که برای شما میفرسته . بذارید یکم بیشتر بدونیم . یعنی چی پیام میده به ما ؟ سوال خیلی خوبیه .
در برنامه های ویندوزی ما در برنامه مون یه تابعی به نام Window Procedure باید تعریف کنیم که شاهراه ارتباطی ما با ویندوزه. هر وقت ویندوز دلش خواست به ما پیام بده این تابع رو صدا میزنه و یه خبری به ما میده . مثلا میگه که کلید فلان زده شد. یا ماوس روی فلان نقطه شما زده شد . یامیگه که باباجون ! یه پنجره اومد روی شما و رفت کنار باید خودتو دوباره طراحی کنی ! از این پیاما میده . خوب برنامه ای که توی کیوتی ( شونصد بار دیگه هم که بگین کیوت درست تر تره ما با کیوتی بیشتر حال میکنی ام ) مینویسین ( البته توی ویندوز ) به همین صورته . یعنی ویندوز برای شما پیام میده . ای بابا دروغ نگو من که تا حالا از ویندوز پیامی دریافت نکردم !
درسته ! اصن کیوتی اومده همین کارو بکنه . چکار ؟ بعضی از چیزا رو از دید شما مخفی کنه و یه راه راحتتر براتون ایجاد کنه . مثلا یکیش همین پردازش رخداد ها ( پیام ها ) است. زمانیکه ویندوز پیام میده براتون کیوتی یکم ملایم تر ! خبرتون میکنه تا هر کاری که میخواید بکنید.
بذارید بحث رو باحال ترش کنیم ! سیگنال ها به نظرتون چی هستند ؟ اونا هیچی نیستند جز پیام ها که به شیوه خاصی اعلان میشند! یعنی چی ؟ ببینید قرار شد وقتی روی منِ دکمه کلیک شد ویندوز با پیامی من رو خبر کنه . خب من ِ دکمه هم شما رو با سیگنالی خبر میکنم. پس بذارید جمع بندی کنم : برخی از پیام های مهم به صورت سیگنال در اختیار ما قرار داده میشند تا راحتر تر باشیم . و برخی هم اگه قراره باهاشون کاری کنیم باید بریم سراغ بحث پردازش پیام ها ( رخداد) (Event Processing) .حالا یه سوال؟ میشه من از سیگنال یه پیام استفاده نکنم و بجاش از پیام به صورت مستقیم استفاده کنم؟ سوال خوبی بود . به صورت مستقیم مستقیم که نه . ولی میتونید از راه یکم مستقیم تر به نام پردازش رخداد ها استفاده کنید. مثلا میدونیم که دکمه سینگال clicked داره . در عین حال ما میتونیم رخداد کلیک شدن روی یه دکمه را خودمون تعریف کنیم که چه اتفاقی در جواب اون رخداد بیفته.
پس به اینجا رسیدیم که در ویندوز وقتی کاربر یه کاری کرد، ویندوز از طریق پیام به ما خبر میده. ما هم شاید بخواهیم در جواب اون پیام یه کاری انجام بدیم . انجام اینکارا توی کیوتی Event Handling یا Event Processing نام داره. مثلا تاحالا شده از خودتون بپرسید که چطور میشه مثلا وقتی روی یه ویدجت خالی کلیک میشه یه اتفاقی بیفته ؟ نپرسیدین ؟ واقعا ؟
قانون زیر رو حیفم اومد ترجمه کنم : As a rule, signals are useful when using a widget, whereas events are useful when implementing a widget.برای مثال وقتی داریم از دکمه استفاده میکنیم راحت تر هستیم که از سیگنال استفاده کنیم تا اینکه خودمون رو درگیر پیامهای ماوس کنیم.
زمانیکه اتفاقی می افته برای یه ویدجت که ویندوز براش پیام میفرسته مثلا فرض کنیم روی یه ویدجت کلیک میشه ، کارایی که قراره در جواب اون اتفاق انجام بشه توی یه تابعی قرار میگیره که با کلمه Event تموم میشه . مثلا چی ؟ فرض کنید روی ویدجت ما کلیک میشه در اینجا ما تابعی خواهیم داشت به نام mousePressEvent که هر دستوری داخلش بنویسیم برای ما اجرا میشه( البته هر مرتبه که روی ویدجت ما کلیک شد. ) این تابعها کجا بودند ؟ این تابع ها به صورت مجازی (virtual) در کلاس QWidget قرار دارند و ما با باز تعریف آنها (Re Implement) باعث میشیم که تابع ما به جای تابع اصلی صدا زده بشه. برخی مواقع هم تابعی که توی کلاس هستش کاری انجام نمیده . مثلا mousePressEvent داخل QWidget هیچ کاری انجام نمیده. از کجا فهمیدیم؟ از اینجا که با کلیک کردن روی یه ویدجت هیچ اتفاقی نمی افته. ولی اگه من بیام و این تابع رو باز تعریف کنم و توش یه دستوری بنویسم ، از این به بعد هر بار که من روی ویدجتم کلیک میکنم یه اتفاقی خواهد افتاد.
بذارید یه مثال ساده بزنیم. یه کلاس به برنامه تون اضافه کنید که از QWidget ارث برده باشه. حالا به فایل header خط زیر را اضافه کنید:

  1. protected:
  2.    void mousePressEvent(QMouseEvent *);

تعریفشون به صورت زیره

  1. void Widget::mousePressEvent(QMo
    {
    useEvent *)
  2.    QMessageBox::information( this, "Clicked", "I'm clicked!");
  3. }

حالا اون رو به صورت زیر تعریف کنید :
حالا یه شی از این کلاس جدیدتون بسازید و با تابع show اونو نمایش بدین و بعد روی ویدجتتون کلیک کنید .
حالا به عنوان تمرین یه کلاس از کلاس QPushButton ارث ببرین و تابع mousePressEvent اونو خودتون باز تعریف کنید ببینید چی میشه و چطور میشه حلش کرد ؟ ( سوال مهمی بودا)
فعلا...





نوع مطلب : گوناگون، کلاس های Qt، 
برچسب ها : کیوتی، کیوت، qt، Qt، QT، events in qt، event، رخداد، رخدادها، پیام ها در کیوتی، پیام،