آدرس درس قبلی:
کد:http://forum.p30world.com/showpost.php?p=1334812&postcount=4
آدرس درس بعدی:
کد:http://forum.p30world.com/showpost.php?p=1421425&postcount=31
پاسخ گویی به رویداد ها توسط Slot ها و Signal ها
دکمه هم مانند برچسب، یک Widget است. اما تفاوتی که با Lable دارد این است که، برنامه شما نیاز دارد بفهمد چه موقعی بر روی دکمه کلیک می شود. در زیر برنامه ای را مورد بررسی قرار می دهیم که با فشار دادن دکمه اجرای آن متوقف می شود.
کد:1 /* exitbutton.cpp */
2 #include <qapplication.h>
3 #include <qpushbutton.h>
4 #include <qstring.h>
5
6 int main(int argc,char **argv)
7 {
8 QApplication app(argc,argv);
9 QString string(“Exit”);
10 QPushButton *button = new QPushButton(string,NULL);
11 QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit()));
12 button->setGeometry(0,0,80,50);
13 button->show();
14 app.setMainWidget(button);
15 return(app.exec());
16 }
برای این که دکمه در مقابل کلیک ماوس پاسخگو باشد، لازم است در ازای کلیک کاربر، پیغام ویژه ای برای یک متد خاص بفرستد. در برنامه فوق آن متد، تابع quit می باشد. این عملیات در خط 11انجام شده است. پیغامی که در ازای کلیک کاربر ارسال می شود را سیگنال می گوییم و متدی که سیگنال را دریافت می کند اسلات نامیده می شود.
در واقع در خط یازدهم برنامه، با استفاده از متد connect، که متعلق به شیئ QObject می باشد، سیگنال کلیک موشواره بر روی شیئ button را به اسلات quit که متعلق به شیئ app است متصل نموده ایم.
اتصال بین سیگنال ها و اسلات ها از طریق متد connect ایجاد می شود. این متد دارای دو پارامتر است که پارامتر اول سیگنال و پارامتر دوم اسلات مورد نظر است.
اگر قبل از این با سیستم های رویدادگرای دیگر کار کرده باشید حتماً با مفهوم callback function آشنایی دارید. Signal ها هم مانند callback function ها می باشند. با این تفاوت که signal ها type safe هستند.
در مثال بعدی مشاهده خواهید کرد که سیگنال ها و اسلات ها چگونه اشیای مختلف را با هم هماهنگ می کنند. در این برنامه کاربر می تواند سن خود را از طریق یک Spin Box یا یک Slider وارد کند. این دو Widget به صورت خودکار با هم هماهنگ هستند. این هماهنگی از طریق اسلات ها و سیگنال ها به وجود می آید. به این ترتیب که در هر شیئ سیگنالی وجود دارد که به اسلات شیئ دیگر متصل است و روند تغییرات را به گوش آن شیئ می رساند.
کد:#include <qapplication.h>
002 #include <qhbox.h>
003 #include <qslider.h>
004 #include <qspinbox.h>
005 int main(int argc, char *argv[])
006 {
007 QApplication app(argc, argv);
008 QHBox *hbox = new QHBox(0);
009 hbox->setCaption("Enter Your Age");
010 hbox->setMargin(6);
011 hbox->setSpacing(6);
012 QSpinBox *spinBox = new QSpinBox(hbox);
013 QSlider *slider = new QSlider(Qt::Horizontal, hbox);
014 spinBox->setRange(0, 130);
015 slider->setRange(0, 130);
016 QObject::connect(spinBox, SIGNAL(valueChanged(int)),
017 slider, SLOT(setValue(int)));
018 QObject::connect(slider, SIGNAL(valueChanged(int)),
019 spinBox, SLOT(setValue(int)));
020 spinBox->setValue(35);
021 app.setMainWidget(hbox);
022 hbox->show();
023 return app.exec();
024 }
این برنامه شامل سه Widget می باشد. در خط هشتم hbox را به وجود آورده ایم. این شیئ Widget اصلی برنامه خواهد بود و با بستن آن برنامه به پایان خواهد رسید. همان طور که می بینید در خط 21 تابع setMainWidget را فراخوانی کرده ایم.
در خطوط 12 و 13 نیز به ترتیب spinBox و slider را بوجود آورده ایم. همانطور که ملاحظه می کنید هر دوی این اشیاء را به عنوان فرزندان hbox ایجاد کرده ایم. به این ترتیب این اشیاء درون hbox قرار می گیرند. شیئ hbox این ویژگی را دارد که باعث می شود تمام اشیاء درون آن بطور خودکار به ترتیب کنار یکدیگر قرار گیرند. بنابراین نیازی به تعیین دقیق موقعیت و اندازه اشیاء فرزند نیست. البته این کلاس در Qt3 وجود دارد و در نسخه چهارم باید از کلاس Q3HBox استفاده نمایید. در خط 11 متد setSpacing باعث می شود هر شیئی که درون hbox قرار می گیرد با فاصله 6 پیکسل نسبت به شیئ قبلی قرار بگیرد. متد setMargin هم یک حاشیه 6 پیکسلی برای شیئ hbox در نظر می گیرد.
متد setRange در خطوط 14 و 15 محدوده معتبر برای spibBox و slider را، اعداد بین 0 تا 150 قرار می دهد.
حال موقع آن است که اتصال بین دو شیئ را برقرار کنیم. این کار را طبق معمول با فراخوانی متد connect انجام می دهیم.
در خط 21 spinBox را مقدار دهی اولیه کرده ایم. به محض اجرای برنامه مقدار spinBox تغییر می کند و این باعث می شود سیگنال valueChanged فعال شود. بنابر این اسلات setValue مربوط به شیئ slider آن را دریافت می کند و مقدار slider نیز بروز رسانی می شود.
در خط 22 نیز متد show از شیئ hbox را فراخوانی کرده ایم. این متد باعث می شود شیئ hbox و تمام فرزندان آن بر روی صفحه نمایش داده شوند.
فایل زیر را برای نسخه چهارم Qt استفاده کنید. در این فایل تعدادی از توابع و کلاس هایی که تنها در Qt3 قابل استفاده بوده اند حذف شده اند:
کد:01 #include <qapplication.h>
02 #include <qslider.h>
03 #include <qspinbox.h>
04 int main(int argc, char *argv[])
05 {
06 QApplication app(argc, argv);
07 QWidget *hbox = new QWidget;
08 hbox->setWindowTitle("Enter Your Age");
09 QSpinBox *spinBox = new QSpinBox(hbox);
10 QSlider *slider = new QSlider(Qt::Horizontal, hbox);
11 spinBox->setRange(0, 130);
12 slider->setRange(0, 130);
13 spinBox->setGeometry(6,6,70,15);
14 slider->setGeometry(6,40,140,15);
15 QObject::connect(spinBox, SIGNAL(valueChanged(int)),
16 slider, SLOT(setValue(int)));
17 QObject::connect(slider, SIGNAL(valueChanged(int)),
18 spinBox, SLOT(setValue(int)));
19 spinBox->setValue(35);
20 hbox->show();
21 return app.exec();
22 }