Qt5 QTreeView редактируется с помощью виртуальной клавиатуры

Работа в киоске с сенсорным экраном, в котором есть виджет виртуальной клавиатуры. Во всех диалогах виртуальная клавиатура является единственным способом несенсорного ввода. Сейчас я работаю над QTreeView для отображения имен файлов с помощью QFileSystemModel, и я добавил столбец с именем Новое имя (все остальные столбцы, кроме имени, скрыты). Я переопределил createEditor() и destroyEditor() для делегата, назначенного для QTreeView, и переопределил data() и setData() для модели. Переопределение createEditor() возвращает указатель на локальный объект QLineEdit, чтобы я мог контролировать результаты редактирования (подключая их к объекту данных моей модели для этого нового столбца).

С моей физической клавиатурой я могу вносить изменения в ячейку «Новое имя» для данной строки, но я не могу понять, как печатать на виртуальной клавиатуре, не теряя фокуса и не вызывая destroyEditor() для редактируемого элемента. Любые идеи о том, как это можно сделать? Я копался в коде Qt, но пока не повезло.


person bmahf    schedule 28.03.2016    source источник


Ответы (1)


На виртуальной клавиатуре не должно быть фокусируемых виджетов. Он должен быть нейтральным по отношению к фокусу. Тогда это не будет воровать фокус. В этом ответе есть рабочий пример, который не крадет фокус и синтезирует события нажатия клавиш, которые отправляются в сфокусированный виджет.

person Kuba hasn't forgotten Monica    schedule 28.03.2016
comment
Большое спасибо за вклад. Меня перетащили в другом направлении, но я просто изменил свой код, чтобы конструкторы виджета виртуальной клавиатуры и виджетов кнопок содержали следующие две строки: setWindowFlags(Qt::X11BypassWindowManagerHint); setFocusPolicy(Qt::NoFocus); Работает отлично. Еще раз спасибо. - person bmahf; 04.04.2016
comment
Кстати, кажется, мне пришлось поместить это как в конструктор клавиатуры, так и в конструктор кнопок, иначе это не сработало. Кроме того, оба они были необходимы, когда ни один из них не работал сам по себе. - person bmahf; 04.04.2016
comment
Кстати, у меня есть еще одна проблема, которую я вижу сейчас. Когда я нажимаю на элемент, я хочу заполнить его начальным текстом, и когда я нажимаю на элемент, а затем снова нажимаю на него, я не хочу, чтобы он был пустым, но я хочу, чтобы он продолжал показывать текст который был в ячейке до применения редактора. В createEditor() я сначала устанавливаю объект QLineEdit с текстом, который я хочу отобразить, а затем возвращаю его. Но текст не отображается. Похоже, что он становится пустым при передаче обратно вызывающей стороне Qt. - person bmahf; 04.04.2016
comment
@bmahf Если у вас есть отдельный вопрос, задайте его отдельно. Не забудьте включить минимальный тестовый пример, воспроизводящий его! - person Kuba hasn't forgotten Monica; 04.04.2016