Я пытаюсь создать QWidget
, имитирующую итальянский Apple Magi c Раскладка клавиатуры (изображена на рисунке) в PyQt5.
Я пытался найти какой-то код в Интернете, но я нашел только код QML (я не знаком с ним) или очень длинный код C ++, реализующий больше, чем просто набор кнопок. Итак, я попытался внедрить клавиатуру самостоятельно, но мне не удалось (подробности о неудачных попытках приведены ниже).
Это ключевые моменты, которые делают это Задача менее тривиальна, чем это может выглядеть.
- Я бы хотел, чтобы ключи сохранили свое соотношение сторон (квадраты должны оставаться квадратами). Если я изменю размер окна, содержащего клавиатуру, то клавиатура должна иметь размер максимального прямоугольника, содержащегося в окне, и сохранять соотношение сторон клавиш (поэтому нельзя использовать фиксированную длину, но нужно работать с 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 перечисленным критическим точкам. выше.