View Full Version : مبتدی: سیگنال ، اسلات و امیت
vasilopita
یک شنبه 11 تیر 1391, 14:48 عصر
سلام دوستان. من یکم گیج شدم؛ لطفا کمک کنید:
چیزی که من متوجه شدم اینه که فرضا ما یه دکمه داریم که سیگنالش میشه رویداد کلیک کردن ، حالا وقتی کلیک می کنیم اسلاتش که مثلا یه تابعه اجرا میشه. پس تا اینجا ما هر وقت یک سیگنال رو داریم که به اجرا در میاید بلافاصله یه اسلات هست که اجرا میشه؛ در واقع سیگنال اول باید اجرا شه که بعد اسلاتش اجرا بشه. درسته ؟؟
چیزی که باعث شد یه خورده گیج بشم اینه که پس این emit چیه ؟؟ این مثال رو ببینید :
class Employee : public QObject
{
Q_OBJECT
public:
Employee() { mySalary = 0; }
int salary() const { return mySalary; }
public slots:
void setSalary(int newSalary);
signals:
void salaryChanged(int newSalary);
private:
int mySalary;
};
void Employee::setSalary(int newSalary)
{
if (newSalary != mySalary) {
mySalary = newSalary;
emit salaryChanged(mySalary);
}
}
خوب الان این اسلات setsalary سیگنال salarychanged رو اجرا کرده ؟؟!!
vasilopita
دوشنبه 12 تیر 1391, 15:18 عصر
آیا کسی هست که مرا یاری کند ؟؟
returnx
دوشنبه 12 تیر 1391, 19:21 عصر
من منتظر بودم دوستان با تجربه تر در Qt جواب بدند ، اما دیدم هیچ کس جوابی نمیده ، ظاهرا این مسئله برای همه سواله!!
من یکسری جستجو کردم به این نتایج رسیدم ، شاید خیلی کامل و قانع کننده نباشه...(البته در مورد Emit)
چیزی که من متوجه شدم اینه که فرضا ما یه دکمه داریم که سیگنالش میشه رویداد کلیک کردن ، حالا وقتی کلیک می کنیم اسلاتش که مثلا یه تابعه اجرا میشه. پس تا اینجا ما هر وقت یک سیگنال رو داریم که به اجرا در میاید بلافاصله یه اسلات هست که اجرا میشه؛ در واقع سیگنال اول باید اجرا شه که بعد اسلاتش اجرا بشه. درسته ؟؟
درسته...
A slot is a function that is called in response to a particular signal.
چیزی که باعث شد یه خورده گیج بشم اینه که پس این emit چیه ؟؟ این مثال رو ببینید :
Class A emits the sigA signal, and both Class B and Class C hava a slot (slotB and slotC)
The main loop connects the signal sigA with both the slots (slotB and slotC)
In this way, Class A doesn't need to know anything about Class B and Class C (really good from a design point of view), besides this, you can have objects connecting and disconnecting the signal at runtime, and then the behaviour of the system will change over time
این لینک ها رو مطالعه کنید :
http://qt-project.org/doc/qt-5.0/signalsandslots.html
http://www.qtforum.org/article/17885/purpose-of-emit-keyword.html
البته در فصل اول ، بخش اول (صفحه ی 13) کتاب Foundation of Qt Development آقای john Thelin ، توضح کاملی وجود داره...
من چون کد شما رو درست نمیتونم ببنیم ، نمیتونم به سوال آخرتون جواب خاصی بدم...
البته باید بگم من هم خودم کامل Emit رو نفهمیدم چون طبق Link فروم بالا ، کسی که سوال میپرسه میگه اگه Emit رو اگه حذف کنیم بازم برنامه به درستی اجرا میشه!!
alamate_aoal
سه شنبه 13 تیر 1391, 01:31 صبح
سلام
مکانیزم سیگنال ها و اسلات ها یکی از بهترین امکاناتی هست که Qt به ++C اضافه کرده و این قابلیت رو به برنامه نویس میده تا اشیاء مختلف را بدون اینکه نیازی به دونستن اطلاعی نسبت به همدیگه داشته باشن , بطور قابل انعطاف bind کنه و کد خواناتر و قابل استفاده مجدد بنویسه
سیگنال ها پیاده سازی نمیشن بلکه فقط emit میشن , در حقیقت emit باعث ساتع شدن یک سیگنال میشه و چنانچه اسلاتی به اون سیگنال متصل باشه , اجرا خواهد شد .
اسلات ها تقریبا مشابه متدهای ++C هستند , اونها میتونن virtual باشن , overloaded بشن , میتونن private یا public یا protect باشن.
میتونی اونها رو مثل سایر متدهای ++C فراخوانی کنی و خلاصه هر کاری که با متد ها بشه انجام داد با اسلات ها هم میشه انجام داد
تنها تفاوت متد و اسلات قابلیت اتصال اسلات به سیگنال(ها) هست که در اینصورت با emit شدن سیگنال کلیه ی اسلات های متصل به اون به طور اتوماتیک اجرا میشن
vasilopita
سه شنبه 13 تیر 1391, 10:59 صبح
من چون کد شما رو درست نمیتونم ببنیم ، نمیتونم به سوال آخرتون جواب خاصی بدم...
چرا نمی تونید ببینید ؟؟؟!!!
تنها تفاوت متد و اسلات قابلیت اتصال اسلات به سیگنال(ها) هست که در اینصورت با emit شدن سیگنال کلیه ی اسلات های متصل به اون به طور اتوماتیک اجرا میشن
ولی چیزی که اینجا به نظر می رسه اینه که اسلات ، سیگنال رو اجرا کرده!:گریه:
returnx
سه شنبه 13 تیر 1391, 11:13 صبح
چرا نمی تونید ببینید ؟؟؟!!!
مشکل از مرورگر من هست... (بخاطر سرعت لود صفحات با IE 8 باز می کنم ، نمیدونم چرا با Firefox سرعت لود صفحات انقدر پایین هست!! )
ولی چیزی که اینجا به نظر می رسه اینه که اسلات ، سیگنال رو اجرا کرده!:گریه:
بعد از فراخوانی یک سیگنال ، یک اسلات اجرا میشه !!
به طور مثال ، در کد زیر وقتی که رویداد Click اتفاق بیفته (سیگنال Click فراخوانی بشه) ، اسلات map شی Signal Mapper اجرا میشه...
connect(i_button[r_counter][c_counter],SIGNAL(clicked()),i_mapper,SLOT(map()));
vasilopita
سه شنبه 13 تیر 1391, 23:43 عصر
بعد از فراخوانی یک سیگنال ، یک اسلات اجرا میشه !!
به طور مثال ، در کد زیر وقتی که رویداد Click اتفاق بیفته (سیگنال Click فراخوانی بشه) ، اسلات map شی Signal Mapper اجرا میشه...
connect(i_button[r_counter][c_counter],SIGNAL(clicked()),i_mapper,SLOT(map()));
دوست عزیز اینو می دونم ولی اگه شما موفق بشی کد رو ببینی خوهید دید که توی تعریف اسلات setsalary بعد از اینکه یه شرط رو بررسی کرده ، در صورتی که شرط برقرار باشه سیگنال salaryChanged رو emit کرده!!!!!
weox__
سه شنبه 13 تیر 1391, 23:57 عصر
دوست عزیز اینو می دونم ولی اگه شما موفق بشی کد رو ببینی خوهید دید که توی تعریف اسلات setsalary بعد از اینکه یه شرط رو بررسی کرده ، در صورتی که شرط برقرار باشه سیگنال salaryChanged رو emit کرده!!!!!
خوب مگه این کار ایرادی داره ؟
اگه منظورت فراخوانی زنجیر وار سیگنال اسلات هاست که مشکلی نداره این کار و می شه استفاده کرد از این روش .
ولی اگر منظورت اینه که چرا توی یه اسلات یه سیگنال دیگه فرستاده . جوابش اینه : بدلایل منطقی
فرض کن برنامه توی دوتا نخ درجریان هست .تو میخوای وقتی توی یه نخ مقدار یه QSlider افزایش یا کاهش پیدا کرده . علاوه بر عملیات های خاصی که در نظر گرفتی اگر یه شرط درست باشه میخوایی که توی نخ دوم هم یه تغییراتی ایجاد بشه . جواب ساده است . وقتی مقدار متغیر تغییر کرد تو یه سیگنال رو emit میکنی .
یکی از راحت ترین روش های ارتباط بین نخ ها همین سیگنال اسلات هاست .
باز اگه دقیق بگی مشکلت کجا هست ، شاید بتونم کمک بکنم تا مفهوم مطلب رو متوجه بشی .
حامد مصافی
چهارشنبه 14 تیر 1391, 00:22 صبح
خوب الان این اسلات setsalary سیگنال salarychanged رو اجرا کرده ؟؟!!
در اینجا اینکه setsalary یک اسلات هست اصلا مهم نیست!
ما وقتی به این صورت بسته به کد نگاه می کنیم setsalary رو یک متد میبینیم. نه بیشتر. حالا فرض کن کمی دیدمون رو وسیع تر کردیم و کل پروژه فرضی کد شما رو میبینیم. در این صورت setsalary ممکنه به جای دیگری متصل بشه، برای مثال کلیک یک دکمه؛ ما سیگنال کلیک یک دکمه رو به این اسلات متصل می کنید که با کلیک شدن اون دکمه سیگنال های منتشر شده توسط این اسلات دریافت شوند و این متد اجرا بشه.
حالا این چرخه ممکنه ادامه داشته باشه. ممکنه یک سری اسلات های دیگه به salarychangedمتصل شده باشند؛ یعنی این اسلات ها مانند اسلات ما منتظرند تا ببینند کی سیگنال منتشر میشه تا اونو دریافت کنند. emit همین کار رو انجام میده. سیگنال salarychanged منتشر میشه، اگر سیگنالی به اون متصل شده باشه اوو دریافت میکنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.