Обработка фокуса Qt для виртуальной клавиатуры, управляемая только кнопками UDLR - PullRequest
2 голосов
/ 12 августа 2011

У меня есть экран ввода данных на устройстве Qt / Embedded, в котором есть только кнопки вверх / вниз / влево / вправо / выбор. Экран выглядит как калькулятор с QLineEdit сверху и набором QPushButtons для чисел. Кнопки UDLR перемещают фокус вокруг кнопок QPushButtons и выбирают, добавляет номер кнопки в QLineEdit. Это прекрасно работает. Однако, поскольку QLineEdit не имеет фокуса, курсор ввода текста не мигает. QLineEdit просто не выглядит как получатель нажатий кнопок виртуальной клавиатуры, и это не хорошо.

Другие реализации виртуальной клавиатуры Qt, которые я видел, не нуждаются в кнопках клавиатуры, чтобы получить фокус, так как они работают от прикосновения или мыши. Следовательно, QLineEdit может сохранять фокус все время. Это не вариант здесь. Лучшее, что я видел до сих пор, это ручная генерация событий фокуса, чтобы обмануть QLineEdit, заставляя его думать, что он имеет фокус, когда пользователь действительно перемещается по виртуальной клавиатуре. Я надеюсь, что есть более элегантное решение или, возможно, другой способ структурировать реализацию экрана, которая позволяет избежать этой проблемы. Есть идеи?

1 Ответ

1 голос
/ 13 августа 2011

Поскольку кажется, что вам не нужны истинные возможности редактирования QLineEdit, замените его на QLabel.Вы можете вложить его в рамку, чтобы он выглядел как поле для редактирования.Затем вы можете смоделировать мигающий курсор, используя QTimer, который не требует фокусировки для работы.

Запустите таймер с интервалом 500 мс, а в слот таймера вставьте или удалите '|'символ, подобный следующему:

void MainWindow::slot_timeout()
{
    QString labelText = label->text();    
    if(labelText.right(1) == "|")
    {
        labelText = labelText.left(labelText.size()-1);
    }
    else
    {
        labelText += "|";
    }    
    label->setText(labelText);
}

Когда нажата кнопка выбора, вставьте соответствующий символ в начале строки, чтобы мигающий курсор оставался на правом конце.

void MainWindow::slot_selectClick()
{
    QString labelText = label->text();
    labelText.prepend("x");
    label->setText(labelText);
}

Этого может быть достаточно для достижения желаемого эффекта.

...