Виртуальная клавиатура Qt [PyQt 5.8] — стиль не найден, невозможно изменить размер виртуальной клавиатуры

Я пытался работать с виртуальной клавиатурой Qt, и все шло неплохо, пока...


Проблема в следующем:

  1. Устанавливаются переменные среды. (вроде проверка)
  2. QT_VIRTUALKEYBOARD_STYLE(не найдено). Я уже создал свой собственный стиль из другого сообщения stackoverflow, кажется довольно хорошим, но его не находят.

ВНИМАНИЕ: Не удается найти стиль ".../INTERACT/interact-ii/tools/en_GB/customkb.qml" - запасной вариант: "по умолчанию"

Некоторые попытки:

  1. Поместил файл customkeyboard.qml в свой собственный проект и установил для переменной его путь.
  2. Поместил всю папку «en_GB» из папки Qt по умолчанию в мой проект с моей модификацией.
  3. Также установил переменную с исходным путем из папки Qt с моим стилем.
  4. Скачал Qt 5.8/5.7/5.6 и сделал то же самое для всех qtvirtualkeyboard.
  5. Увидев вышеуказанную ошибку (запасной вариант: «по умолчанию»), я попытался добавить свои элементы qml в default.qml из папки qt. [.../Qt/5.8/Src/qtvirtualkeyboard/src/virtualkeyboard/content/styles/default]
  6. Открыл файл qtvirtualkeyboard.so с помощью QTCreator и построил все после изменения моих файлов qml, чтобы посмотреть, изменится ли что-то, и ничего не изменилось.

Кажется, ни один из них не меняет размер и расположение моей клавиатуры.


Вот файлы, которые имеют значение с небольшим примером.

1 – небольшой пример использования клавиатуры.

import os
import sys

from PyQt5.QtCore import QProcessEnvironment
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QWidget

os.environ["QT5DIR"] = "/home/epson/Qt/5.8/gcc_64"
os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = "/home/epson/Qt/5.8/gcc_64/plugins/platforms"
os.environ["QT_PLUGIN_PATH"] = "/home/epson/Qt/5.8/gcc_64/plugins"
os.environ["QML_IMPORT_PATH"] = "/home/epson/Qt/5.8/gcc_64/qml"
os.environ["QML2_IMPORT_PATH"] = "/home/epson/Qt/5.8/gcc_64/qml"

os.environ["QT_VIRTUALKEYBOARD_LAYOUT_PATH"] = "/home/epson/INTERACT/interact-ii/tools/en_GB/customkb.qml"
os.environ["QT_VIRTUALKEYBOARD_STYLE"] = "/home/epson/Qt/5.8/Src/qtvirtualkeyboard/src/virtualkeyboard/content/styles"
os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"

for i in QProcessEnvironment.systemEnvironment().keys():
    print(i)

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.line_edit = None


        self.init_ui()

    def init_ui(self):
        self.line_edit = QLineEdit()
        self.line_edit2 = QLineEdit()
        self.layout = QVBoxLayout()
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.layout.addWidget(self.line_edit)
        self.layout.addWidget(self.line_edit2)
        self.setCentralWidget(self.main_widget)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

2 – Мой файл customkeyboard.qml

/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.VirtualKeyboard 2.1
import "content"

Item {
    width: 1280
    height: 720

    Item {
        id: appContainer
        width: Screen.width < Screen.height ? parent.height : parent.width
        height: Screen.width < Screen.height ? parent.width : parent.height
        anchors.centerIn: parent
        rotation: Screen.width < Screen.height ? 90 : 0
        Basic {
            id: virtualKeyboard
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.right: parent.right
            anchors.bottom: inputPanel.top
        }

        /*  Handwriting input panel for full screen handwriting input.

            This component is an optional add-on for the InputPanel component, that
            is, its use does not affect the operation of the InputPanel component,
            but it also can not be used as a standalone component.

            The handwriting input panel is positioned to cover the entire area of
            application. The panel itself is transparent, but once it is active the
            user can draw handwriting on it.
        */
        HandwritingInputPanel {
            z: 79
            id: handwritingInputPanel
            anchors.fill: parent
            inputPanel: inputPanel
            Rectangle {
                z: -1
                anchors.fill: parent
                color: "black"
                opacity: 0.10
            }
        }

        /*  Container area for the handwriting mode button.

            Handwriting mode button can be moved freely within the container area.
            In this example, a single click changes the handwriting mode and a
            double-click changes the availability of the full screen handwriting input.
        */
        Item {
            z: 89
            visible: handwritingInputPanel.enabled && Qt.inputMethod.visible
            anchors { left: parent.left; top: parent.top; right: parent.right; bottom: inputPanel.top; }
            HandwritingModeButton {
                id: handwritingModeButton
                anchors.top: parent.top
                anchors.right: parent.right
                anchors.margins: 10
                floating: true
                flipable: true
                width: 76
                height: width
                state: handwritingInputPanel.state
                onClicked: handwritingInputPanel.active = !handwritingInputPanel.active
                onDoubleClicked: handwritingInputPanel.available = !handwritingInputPanel.available
            }
        }

        /*  Keyboard input panel.

            The keyboard is anchored to the bottom of the application.
        */
        InputPanel {
            id: keyboard;
            y: screenHeight; // position the top of the keyboard to the bottom of the screen/display

            anchors.left: parent.left;
            anchors.right: parent.right;

            states: State {
                name: "visible";
                when: keyboard.active;
                PropertyChanges {
                    target: keyboard;
                    // position the top of the keyboard to the bottom of the text input field
                    y: textInput.height;
                }
            }
            transitions: Transition {
                from: ""; // default initial state
                to: "visible";
                reversible: true; // toggle visibility with reversible: true;
                ParallelAnimation {
                    NumberAnimation {
                        properties: "y";
                        duration: 250;
                        easing.type: Easing.InOutQuad;
                    }
                }
            }
        }
    }
}

ВОПРОС:

Я делаю что-то неправильно при установке переменных STYLE и LAYOUT? Что из них обоих я действительно должен настраивать, это переменная STYLE или LAYOUT, которая изменит размер и расположение моей клавиатуры? Куда мне действительно поместить файл qml? Что я делаю не так? Не вижу в чем проблема!!

Наблюдения: даже после этого сообщения это не сработало. Сделал все точно так же, но кажется чего-то не хватает или я что-то не понимаю.


person yurisnm    schedule 24.05.2017    source источник


Ответы (1)


Я считаю, что вы путаете макеты со стилями, что создает для вас несколько проблем.

Макеты

  1. Qt использует файлы .qml в каталоге en_GB для раскладки клавиатуры.
  2. Чтобы включить ваши пользовательские раскладки, вы должны указать переменную QT_VIRTUALKEYBOARD_LAYOUT_PATH на каталог, который вы создали для своих пользовательских раскладок (например, QT_VIRTUALKEYBOARD_LAYOUT_PATH=/path/to/custom/keyboard-layout/mycustomlayout). Затем, чтобы добавить пользовательскую раскладку для британского английского, вы должны создать каталог en_GB в /path/to/custom/keyboard-layout/mycustomlayout. В вашем каталоге en_GB у вас должен быть как минимум файл main.qml.
  3. Вы назвали свой файл customkeyboard.qml. Чтобы Qt правильно находил, загружал и обрабатывал ваш пользовательский макет, вы должны следовать соглашению об именовании файлов макетов по умолчанию (т. е. main.qml, handwriting.qml, symbols.qml), как указано ://doc.qt.io/qt-5/technical-guide.html#layout-types" rel="nofollow noreferrer">здесь.

Стили

Для пользовательских стилей вы должны поместить свой собственный каталог стилей в $$[QT_INSTALL_QML]/QtQuick/VirtualKeyboard/Styles, как указано здесь. Очевидно, ваш пользовательский файл style.qml находится в каталоге вашего пользовательского стиля.

Надеюсь, это поможет вам прояснить некоторые вещи.

person Matt Bontrager    schedule 25.05.2017
comment
О, я думаю, я понял разницу между тем и сейчас. Просто чтобы быть уверенным, если я хочу переместить клавиатуру в другое место и изменить ее размер, я должен работать с пользовательским стилем, я прав? В остальном разберусь. Уже большое спасибо за ответ. Попробую то, что вы предложили, и вернусь) - person yurisnm; 26.05.2017
comment
Привет, Мэтт, я получил макет en_GB, вставил в свой проект, установил QT_VIRTUALKEYBOARD_LAYOUT_PATH на мой путь en_GB внутри моего проекта. Я заблудился отсюда, куда мне положить свой макет (с расположением и размером)? Должен ли я редактировать main.qml из en_GB или создать свой собственный файл .qml. Путь должен быть от всей папки или только моего файла .qml с макетом, который я хочу. Немного заблудился отсюда. - person yurisnm; 26.05.2017
comment
Я полностью понимаю путаницу. Семантика в Qt допускает двусмысленность. - person Matt Bontrager; 26.05.2017
comment
Чтобы уточнить, QT_VIRTUALKEYBOARD_LAYOUT_PATH следует установить в папку, содержащую en_GB. Чтобы подтвердить, что у вас все правильно настроено для макета, я бы просто поменял местами первые две клавиши в main.qml (например, «W» вместо «Q»), чтобы убедиться, что Qt использует макет, которым вы собираетесь манипулировать. . Определите местоположение, размер и т. д. в style.qml. Этот файл должен быть помещен в $$[QT_INSTALL_QML]/QtQuick/VirtualKeyboard/Styles/YourCustomStyleNameGoesHere/style.qml с QT_VIRTUALKEYBOARD_STYLE установленным на $$[QT_INSTALL_QML]/QtQuick/VirtualKeyboard/Styles/YourCustomStyleNameGoesHere - person Matt Bontrager; 26.05.2017
comment
Снова привет, Мэтт, извините, что беспокою вас, я наконец-то заработал свой стиль, и по какой-то причине мой макет не подходит к тому, который я определяю с помощью QT_VIRTUALKEYBOARD_LAYOUT_PATH. Но в любом случае, поскольку я хочу просто изменить размер и местоположение, и это в стиле, я много борюсь за это, я возился с клавиатуройDesignWidth keyboardDesignHeight keyboardRelativetopMargin ... и ни один из них, похоже, не меняется. Мой макет сходит с ума, только его внутренние ключи меняют размер и местоположение, а не сам размер/местоположение в килобайтах. Прочитал, что это должно быть где-то внутри InputPanel, какой-нибудь совет? - person yurisnm; 29.05.2017
comment
Я читал, что мне нужно просто установить переменные width и y в InputPanel, и высота будет регулироваться сама по себе, о местоположении, которое мне просто нужно установить для родителя-якоря, .... Но я все еще немного теряюсь в этом, где я должен это поместить, но когда я пытаюсь поместить его в стиль, он просто ломается, и атрибута этого типа нет. Я действительно «нуб» с qml, и я собираюсь взорваться, пытаясь заставить это работать почти неделю. Не могли бы вы дать какие-нибудь указания относительно тех вещей, которые я только что сказал? - person yurisnm; 29.05.2017