تطلق إشارة مرتين من القائمة المنبثقة gtkmm
سؤال
ولقد كانت فترة من الوقت منذ أن كنت تستخدم GTK +، وكانت آخر مرة فعلت في C، لا تستخدم gtkmm وC ++ كما أنا الآن. على أي حال، ليس لدي ما أعتقد أنه ينبغي أن يكون مشكلة سهلة لحل:
ولدي القائمة المنبثقة تتكون من قائمة أزرار الراديو، وعند النقر فوق واحد منهم أريد بعض الإجراءات لتحدث. رمز غني عن مثل هذا:
Gtk::RadioMenuItem::Group group;
for ( size_t i = 1; i < LH_MAX; ++i )
{
Gtk::RadioMenuItem* pItem = new Gtk::RadioMenuItem( group, names[i], names[i] );
pItem->set_name( names[i] );
pItem->signal_activate().connect( sigc::mem_fun(*this, &MyClass::on_item_activated) );
pItem->show();
m_Menu.append( *Gtk::manage(pItem) );
}
والمشكلة الوحيدة هي أن أرى MyClass::on_item_activated
يحصل يسمى مرتين عندما يتم اختيار زر الراديو سابقا غير محددة من القائمة. انه دعا مرة واحدة فقط عندما يتم النقر على زر الراديو المحددة مسبقا.
وانا التخمين أن إطلاق الأول هو أن نقول "شيئا لم يعد تفعيل"، والثاني هو لتفعيل زر الراديو الجديد. سواء أنا على حق أو على خطأ، والسؤال هو نفسه: كيف يمكن أن أفضل عندي معالج اتخاذ إجراءات مرة واحدة فقط كل نقرة؟ إما أنا في حاجة إلى معالج إلى الحصول على استدعاء مرة واحدة فقط، أو أحتاج شيئا للتحقق من داخله لمعرفة ما إذا كان الاستدعاء هو "مكررة" أم لا.
المحلول
هل يمكن استخدام sigc :: ربط لتوفير العنصر كوسيطة إلى وظيفة رد الاتصال.
pItem->signal_activate().sigc::bind(sigc::mem_fun(*this,&MyClass::on_item_activated),pItem));
وبعد ذلك يمكنك استخدام item-> get_active () في رد للرد على التنشيط فقط.
void MyClass::on_item_activated(Gtk::RadioMenuItem* item) {
if (item->get_active()) {
// Do some stuff
}
}
نصائح أخرى
وهذا هو ما أقوم به جدا، الاتصال signal_toggled()
ومعرفة ما اذا كان get_active()
غير صحيح.
وأنا لا أعرف بالضبط ما كنت تحاول إنجاز (أو ما MyClass هو وما قاعدة الطبقات فإنه يرث من)، ولكن الاتصال signal_toggled()
قد تكون أكثر فائدة من signal_activate()
و/ نتفق مع يوهانس. تحقق مما إذا تم تفعيل هذا البند عندما تلقي إشارة.