wxButton с SetDefault () больше не реагирует на ввод во фрейме

0

У меня есть приложение, которое изначально работало с wx2.8 и с тех пор было перенесено на wx3.0. Этот фрейм приложения имеет кнопку "Подключиться", на которую вызывается SetDefault() при создании кнопки. В разделе wx2.8 эта кнопка генерирует событие с щелчком, когда ключ ввода был распознан. В wx3.0 это больше не работает. Я пытаюсь обойти это с помощью горячих клавиш, но они представляют свой собственный набор проблем с модальными диалогами, когда ключ ввода определяется как горячая клавиша. Событие с горячей клавишей, по-видимому, не будет передавать ключевое событие, даже если оно было пропущено. Есть ли у кого-нибудь какие-либо предложения или работы?

В прошлую пятницу я подумал, что это может иметь какое-то отношение к инициализации кадра стилем wxWANTS_CHARS и, действительно, это так. Я также обнаружил, что проблема возникает, если кнопка не инициализирована идентификатором wxID_OK. Следующий код демонстрирует проблему:

#include "wx/wx.h"


class MyFrame: public wxFrame
{
private:
   wxTextCtrl *text_status;
   int click_count;

public:
   MyFrame():
      wxFrame(
         0,
         wxID_ANY,
         "SetDefault",
         wxDefaultPosition,
         wxDefaultSize,
         wxDEFAULT_FRAME_STYLE | wxCLIP_CHILDREN),
      click_count(0)
   {
      wxPanel *panel(new wxPanel(this));
      wxSizer *sizer(new wxBoxSizer(wxVERTICAL));
      wxButton *button;


      text_status = new wxTextCtrl(panel, wxID_ANY);
      sizer->Add(text_status, 0, wxALL, 10);
      button = new wxButton(panel, wxID_HIGHEST + 1, "Increment");
      sizer->Add(button, 0, wxALL, 10);
      button->SetDefault();
      panel->SetSizerAndFit(sizer);
   }

   void on_increment(wxCommandEvent &event)
   {
      wxString content;
      ++click_count;
      content.Printf("%d", click_count);
      text_status->SetValue(content);
   }

   DECLARE_EVENT_TABLE()
};


BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_BUTTON(wxID_OK, MyFrame::on_increment)
END_EVENT_TABLE()


class MyApp: public wxApp
{
   virtual bool OnInit()
   {
      MyFrame *frame(new MyFrame);
      frame->Show(true);
      SetExitOnFrameDelete(true);
      return true;
   }
};


IMPLEMENT_APP(MyApp)
Теги:
wxwidgets

2 ответа

0
Лучший ответ

Я нашел работу по поводу указания идентификатора wxID_OK на кнопку по умолчанию.

1

Если кнопка по умолчанию не реагирует на нажатия клавиш Enter, это выглядит как ошибка в wxWidgets, и вы должны сообщать об этом обычным способом. Попробуйте привести простой пример, воспроизводящий проблему, в идеале, как патч к образцу, если вы это сделаете, потому что это определенно работает в нормальном/большинстве случаев.

  • 0
    Проблема, по-видимому, является результатом указания wxWANTS_CHARS как части стиля кадра. Поскольку это не (или больше не) документированный стиль, я бы предположил, что это недопустимый стиль.
  • 0
    Это действительный стиль, но он говорит, что окно, в котором оно заинтересовано, получает все ключевые события, даже те, которые обычно используются для навигации, и обрабатывает их сам, поэтому неудивительно, что оно отключает обработку Enter по умолчанию.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню