تطلق إشارة مرتين من القائمة المنبثقة gtkmm

StackOverflow https://stackoverflow.com/questions/418591

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد كانت فترة من الوقت منذ أن كنت تستخدم 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()

و/ نتفق مع يوهانس. تحقق مما إذا تم تفعيل هذا البند عندما تلقي إشارة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top