Каков наилучший способ вызвать экранную клавиатуру, когда курсор находится на wxTextCtrl?

Я пытаюсь разработать приложение с сенсорным экраном с графическим интерфейсом, используя wxWidgets (версия 3.0.4). Сенсорный экран работает нормально. Мне нужно использовать экранную клавиатуру для заполнения текстового поля (wxTextCtrl).

Я провел поиск и не нашел никаких функций setfocus или getfocus, доступных для wxTextCtrl. Я также не могу найти какое-либо событие, сообщающее о том, что курсор помещен в текстовое поле, чтобы я мог вызвать экранную клавиатуру.

Доступна ли какая-либо библиотека или мне нужно реализовать собственную версию клавиатуры?


person Manoj    schedule 19.08.2019    source источник
comment
Насколько мне известно, на экранной клавиатуре нет wx. Что касается других ваших вопросов, wxTextCtrl имеет SetFocus() и wxSetCursorEvent.   -  person Ripi2    schedule 19.08.2019
comment
@Mano, в нашем приложении у нас есть текстовый элемент управления и небольшая кнопка рядом с ним. Всякий раз, когда пользователь нажимает эту кнопку или нажимает ее, появляется другое окно wxWindow с кнопкой, представляющей раскладку клавиатуры. Он хорошо работает на wxGTK.   -  person Igor    schedule 22.08.2019
comment
Да, это должен был быть мой план Б, однако было бы предпочтительнее, если бы экранная клавиатура появлялась автоматически. Подумав, я хотел добавить событие EVT_LEFT_DCLICK в EVENT_TABLE, изменив исходный код wxwidgets, файл textctrl.cpp, и с треском не смог этого сделать. Любые идеи о том, как это можно сделать, будут очень полезны   -  person Manoj    schedule 26.08.2019
comment
После некоторых исследований я остановился на использовании этой функции обратного вызова обработчика событий Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(DoSomethingonOnFocus), NULL, this);, в которой я использую system("xvkbd") для вызова экранной клавиатуры. Но проблема в том, что от xvkbd нет обратной связи, пока он не закрыт. То есть все введенные символы буферизуются до закрытия клавиатуры. Как только клавиатура закрыта, символы переносятся в окно/виджет, находящийся в фокусе. Любые лучшие идеи для достижения этого?   -  person Manoj    schedule 05.09.2019


Ответы (1)


Функция wxExecute сделала свое дело. Мне удалось успешно получить обратную связь в приложении wxwidget от нажатий клавиш, выполненных через файл xvkbd. Пример кода ниже:

this->main_frame->text_field->Connect(wxEVT_SET_FOCUS,wxFocusEventHandler(InvokeKeyboard), NULL, this);

void InvokeKeyboard(wxFocusEvent& event)
{
    event.Skip();
    system("killall xvkbd 1>/dev/null 2>/dev/null");
    wxExecute(wxT("xvkbd > /dev/null 2>/dev/null"), wxEXEC_ASYNC | wxEXEC_NODISABLE | wxEXEC_HIDE_CONSOLE );
}

Вы можете найти здесь подробную документацию по wxExecute

person Manoj    schedule 19.07.2020