Создать виртуальную клавиатуру в PyQt - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать QWidget, имитирующую итальянский Apple Magi c Раскладка клавиатуры (изображена на рисунке) в PyQt5.

Я пытался найти какой-то код в Интернете, но я нашел только код QML (я не знаком с ним) или очень длинный код C ++, реализующий больше, чем просто набор кнопок. Итак, я попытался внедрить клавиатуру самостоятельно, но мне не удалось (подробности о неудачных попытках приведены ниже).

An Italian Apple Magic Keyboard from above

Это ключевые моменты, которые делают это Задача менее тривиальна, чем это может выглядеть.

  • Я бы хотел, чтобы ключи сохранили свое соотношение сторон (квадраты должны оставаться квадратами). Если я изменю размер окна, содержащего клавиатуру, то клавиатура должна иметь размер максимального прямоугольника, содержащегося в окне, и сохранять соотношение сторон клавиш (поэтому нельзя использовать фиксированную длину, но нужно работать с rat ios).
  • Между клавишами должно быть некоторое пространство, и соотношение между длиной стороны квадратного ключа и пробелом должно всегда оставаться постоянным, скажем, 8: 1.
  • Вверх и Клавиши со стрелками вниз, и особенно клавиша возврата, являются исключительными клавишами, которые, вероятно, требуют некоторого кода добавления c. Обходной путь для клавиши возврата может состоять в том, чтобы разделить ее на две клавиши, а затем добавить пользовательский файл SVG, чтобы убедиться, что общая граница невидима, и соединить две кнопки таким образом, чтобы при нажатии одной из них также была нажата программная кнопка.
  • Как правило, ключи расположены не в сетке, а в 6 рядах, и каждый ряд совершенно отличается от других и смещен по горизонтали.

Сначала я попытался использовать QGridLayout но вскоре я понял, что он не может обобщать сложные не-сеточные сценарии ios, как в моем случае.

Итак, я попытался использовать один QVBoxLayout, содержащий 6 QHBoxLayout, а затем обработать каждый из этих 6 рядов независимо. Проблема заключалась в том, что я не смог указать соотношение сторон для кнопок определенного ряда. Например, второй ряд сверху имеет 13 квадратных кнопок и еще 1 кнопку ширины / высоты в соотношении 1,5: 1. Я попробовал две следующие возможности для указания кнопки с определенным соотношением сторон, но ни один из них (и немного другие варианты) не сработал. В первом случае я получаю неправильные макеты. Я пытался играть с QSizePolicy, но мне не удалось получить желаемый результат. Во втором случае функция widthForHeight никогда не вызывается. Проблема может заключаться в том, что ConstrainedButton не является подклассом QGraphicsLayout (я не уверен, для чего этот класс предполагается использовать). Я не опубликовал остальную часть своего кода, я просто добавляю эти кнопки в список 6 QHBoxLayout, заключенный в QVBoxLayout.

Метод 1:

class ConstrainedButton(QPushButton):
    def __init__(self, base_width, base_height, *__args):
        super().__init__(*__args)
        size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored)
        self.setSizePolicy(size_policy)
        self.base_width = base_width
        self.base_height = base_height

    def resizeEvent(self, event):
        new_size = QtCore.QSize(self.base_width, self.base_height)
        new_size.scale(event.size(), QtCore.Qt.KeepAspectRatio)
        self.resize(new_size)

Метод 2:

class ConstrainedButton(QPushButton):
    def __init__(self, width_for_height, *__args):
        super().__init__(*__args)
        self.width_for_height = width_for_height
        size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored)
        size_policy.setWidthForHeight(True)
        self.setSizePolicy(size_policy)

    def widthForHeight(self, height):
        return height * self.width_for_height

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...