ورود

View Full Version : سوال: مشکل در سیگنال و اسلات های مربوط به qPushButton



mahak006
یک شنبه 08 بهمن 1391, 22:21 عصر
با سلام . من تو فرمی که درست کردم ، چند تا سیگنال مختلف اضافه کردم که بره checkBox و comboBox و pushButton هستن . بقیه به درستی کار می کنن ، ولی سیگنال های کلیک روی تمامی pushButton های فرمم کار نمی کنن . سیگنال ها رو به شکل زیر connect کردم :

connect(in_pbn_map_vsn,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_vsn_clicked()));
connect(in_pbn_clearAll_vsn,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_vsn_clicked()));
connect(in_pbn_map_wmd,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_wmd_clicked()));
connect(in_pbn_clearAll_wmd,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_wmd_clicked()));


جالب اینجاست که با تکرار خطوط بالا ، (۲ بار تکرار خطوط ) سیگنال ها درست کار می کنن و متصل می شن . یعنی وقتی به صورت زیر نوشته بشه :

connect(in_pbn_map_vsn,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_vsn_clicked()));
connect(in_pbn_clearAll_vsn,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_vsn_clicked()));
connect(in_pbn_map_wmd,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_wmd_clicked()));
connect(in_pbn_clearAll_wmd,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_wmd_clicked()));

connect(in_pbn_map_vsn,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_vsn_clicked()));
connect(in_pbn_clearAll_vsn,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_vsn_clicked()));
connect(in_pbn_map_wmd,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_wmd_clicked()));
connect(in_pbn_clearAll_wmd,SIGNAL(clicked()),this ,SLOT(on_in_pbn_clearAll_wmd_clicked()));

من می خوام بدونم چرا این طور شده و راه حلش چیه . کسی به این مشکل بر خورده و راه حلش رو می دونه ؟ لازمه که کد ها رو درست بنویسم . پس خواهش می کنم کسی پیامی مبنی بر اینکه { درست کار می کنه ، پس چیکارش داری } نده . فقط یه کمکی کنید به جواب برسیم . آخه چیز عجیبیه :متعجب:

حامد مصافی
یک شنبه 08 بهمن 1391, 23:01 عصر
جالبه، میشه یک بار Clean & Build کنی و اگر مشکل حل نشد کد کامل این کلاس زو بذاری؟

mahak006
یک شنبه 08 بهمن 1391, 23:33 عصر
حل نشد . الآن بعد از یه تحلیل به این نتیجه رسیدم . تو تابع پایین که یکی از توابع بالاست یه نگاه بندازید :

void m_control::on_in_pbn_map_wmd_clicked()
{
if(in_pbn_map_wmd->text()=="Radar")
{
in_pbn_map_vsn->setText("Field");
in_pbn_map_wmd->setText("Field");
in_pbn_zoomIn_vsn->setEnabled(true);
in_pbn_zoomIn_wmd->setEnabled(true);
in_pbn_zoomOut_vsn->setEnabled(true);
in_pbn_zoomOut_wmd->setEnabled(true);
}
else
{
in_pbn_map_vsn->setText("Radar");
in_pbn_map_wmd->setText("Radar");
in_pbn_zoomIn_vsn->setEnabled(false);
in_pbn_zoomIn_wmd->setEnabled(false);
in_pbn_zoomOut_vsn->setEnabled(false);
in_pbn_zoomOut_wmd->setEnabled(false);
}
}


تو این تابع ، مشکل اینه که در واقع با یک بار نوشتن connect ها ، سیگنال وصل می شه و تابع اجرا می شه . اما بره if مشکل داره و فقط دستورات else رو انجام میده . در حالی که وقتی دو بار connect ها رو انجام می دم ، درست اجرا می شه .

حامد مصافی
یک شنبه 08 بهمن 1391, 23:52 عصر
به یقین می‌تونم بگم ایراد شما منطقیه. وقتی connect دو بار نوشته بشه دستورات داخل SIGNAL هم ۲ بار اجرا میشن. بدین ترتیب در هر کلیک هر دو قسمت بدنه if شما اجرا خواهند شد!

alamate_aoal
دوشنبه 09 بهمن 1391, 07:18 صبح
سلام
سیستم متا آبجکت در کیوت توسط متد QMetaObject::connectSlotsByName بصورت خودکار تمام سیگنال‌ها و اسلات‌ها ی کلاس جاری که دارای الگوی زیر باشه رو به هم متصل(connect) میکنه:
void on_<your-object-name>_<signal-name>(<signal parameters>);
نامگذاری شما برای اسلات‌ها دقیقا مبتنی بر الگوی فوق الذکر هست , بنابراین نیازی به کانکت کردن بصورت دستی نیست.


جالب اینجاست که با تکرار خطوط بالا ، (۲ بار تکرار خطوط ) سیگنال ها درست کار می کنن و متصل می شن . یعنی وقتی به صورت زیر نوشته بشه :
از کیوت نسخه چند استفاده می کنی؟
اینکه با دوبار نوشتن connect مشکل رفع میشه غیر عادیه(احتمالا جایی رو ترکوندی:لبخند:) - خروجی تمام connect ها رو بررسی کن :
qDebug()<< connect(in_pbn_map_vsn,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_vsn_clicked()));
this->dumpObjectInfo();

و در آخر اگر با تغییر نام اسلات ها مشکل بر طرف نشد کد مریوطه رو بذار.

mahak006
دوشنبه 09 بهمن 1391, 17:18 عصر
سلام
سیستم متا آبجکت در کیوت توسط متد QMetaObject::connectSlotsByName بصورت خودکار تمام سیگنال‌ها و اسلات‌ها ی کلاس جاری که دارای الگوی زیر باشه رو به هم متصل(connect) میکنه:
void on_<your-object-name>_<signal-name>(<signal parameters>);
نامگذاری شما برای اسلات‌ها دقیقا مبتنی بر الگوی فوق الذکر هست , بنابراین نیازی به کانکت کردن بصورت دستی نیست.


از کیوت نسخه چند استفاده می کنی؟
اینکه با دوبار نوشتن connect مشکل رفع میشه غیر عادیه(احتمالا جایی رو ترکوندی:لبخند:) - خروجی تمام connect ها رو بررسی کن :
qDebug()<< connect(in_pbn_map_vsn,SIGNAL(clicked()),this,SLOT (on_in_pbn_map_vsn_clicked()));
this->dumpObjectInfo();

و در آخر اگر با تغییر نام اسلات ها مشکل بر طرف نشد کد مریوطه رو بذار.
من دیشب به اینترنت دسترسی نداشتم . ولی با بررسی مشکلم ، به همین موضوع رسیدم که مطرح کردید . از هر دوی شما متشکرم . اما دلیل ایینکه با دو بار connect کردن بهدرستی اجرا می شد هم همینه . چون ۱ بار با استفاده از همون connectSlotsByName اسلات ها متصل می شدند . و وقتی یک بار خودم به صورت دستی ، اسلات ها رو متصل می کردم ، تابع دو بار پشت سر هم اجرا می شد و به دلیل ویژگی تابع ، فقط قسمت else اجرا می شد . اما با دو بار متصل کردن دستی ، در واقع تابع ۳ بار اجرا می شد و مثل اتصال ۱ بار عمل می کرد و درست اجرا می شد .
ممنون از راهنمایی همگی . به نظرم تو آموزش هایی که بره Qt داده میشه ، این مطلب باید ذکر بشه تا به اشتباه نی افتیم ( مثل بنده حقیر ) .
ممنون .