1

我正在使用 qml qtvirtual 键盘:https ://github.com/qt/qtvirtualkeyboard

我正在尝试将它与基于小部件的 Qt 应用程序的其余部分“连接”。例如,当我单击 QLineEdit 时,我希望键盘出现并在应用程序上下文中充当物理键盘。

为此,我安装了 qtvirtualkeyboard/src (qmake && make && make install) 中的内容,这是我的 main.cpp :

#include <QQuickView>
#include <QApplication>
#include <QQmlEngine>
#include <QQmlContext>

int main(int argc, char *argv[]){

    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

    QApplication app(argc, argv);
    MainWindow w();  // This is a QWidget / QMainWindow
    w.setFixedSize(800, 480);
    w.show();

    return app.exec();
}

当我在桌面上执行此操作时,尽管我的应用程序是 800x480,但键盘占据了我屏幕的一半。

当我在我的 Raspberry Pi 上使用 7 英寸触摸屏执行它时,键盘占据了一半的页面,并且顶部出现了黑色边框。

我想自己修复键盘尺寸。当我使用 Item 等创建 QML 文件时,键盘不再显示。

4

2 回答 2

4

在过去一个月左右的时间里,我一直在与 QtVirtualKeyboard 怪物搏斗。希望您能从我的反复试验中受益。

QtVirtualKeyboard 拼图的碎片

要知道/记住的是,基本上有四个独立的部分可以告知键盘的整体功能和实现:

  1. qtvirtualkeyboard(功能)
  2. 布局(结构)
  3. 风格(演示)
  4. 应用程序中的 Qml(实现)

如果您使用的是 qtvirtualkeyboard 附带的默认布局和样式(换句话说,您还没有创建任何自定义样式或布局),那么值得看看它们以更好地了解背后发生的事情场景。你可以在这里找到它们:

布局: /path/to/qtvirtualkeyboard/src/virtualkeyboard/content/layouts

款式: /path/to/qtvirtualkeyboard/src/virtualkeyboard/content/styles

定位键盘

这是一个(有点过于简化的)示例 Qml 文件,它演示了如何定位键盘。在您的情况下,由于您关心键盘消耗了多少垂直屏幕空间,因此键盘的 y 属性是您要定位的第一件事。

首先,将keyboard.y 设置为您的屏幕高度(例如,parent.height 或者您想要获取该信息)。将键盘顶部放在屏幕底部会隐藏它。

然后,当您单击 TextInput 字段时,调用 QtVirtualKeyboard,在状态从默认/初始更改为“可见”期间将 keyboard.y 属性更改为 TextInput 字段的底部。通过状态更改处理此问题的另一个好处是您可以控制键盘动画。

import QtQuick 2.7
import QtQuick.VirtualKeyboard 2.1

Item {
    id: appSectionWithTextInput

    property int screenHeight: parent.height; // the height of the screen/display
    anchors.fill: parent;

    TextInput {
        id: textInput;
        height: 120;
        width: parent.width - 2;

        color: "#000000"; // black

        // http://doc.qt.io/qt-5/qinputmethod.html#properties
        focus: Qt.inputMethod.visible;

        verticalAlignment: TextInput.AlignVCenter;
    }

    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;
                }
            }
        }
    }
}

自定义布局

如果您想创建自己的自定义布局,最好的办法是将 qtvirtualkeyboard 随附的现有布局之一(例如 en_GB)复制到您选择的目录中。在那里,将其重命名为您喜欢的任何名称并添加以下环境变量:QT_VIRTUALKEYBOARD_LAYOUT_PATH=/path/to/custom/keyboard-layout/mycustomlayout。

注意:在运行应用程序之前,应该将 QT_VIRTUALKEYBOARD_LAYOUT_PATH 环境变量设置为包含自定义键盘布局的文件系统目录。

自定义样式

如果您想创建自己的自定义键盘样式,请参阅此页面以了解您应该在其中创建自定义样式目录的特定目录。

在那里,添加以下环境变量:QT_VIRTUALKEYBOARD_STYLE=mycustomstyle。

如果您想直接操作键盘的大小,可以访问/更改位于自定义样式目录中的 style.qml 文件中的这些属性。

// Properties
keyboardDesignWidth
keyboardDesignHeight
keyboardRelativetopMargin
keyboardRelativerightMargin
keyboardRelativeBottomMargin
keyboardRelativeLeftMargin

您可以在此处找到这些属性的完整列表。

祝你好运!

于 2017-03-30T21:49:55.747 回答
0

好的 AlexanderVX,这是我“qmake && make && make install”的直接链接:https ://github.com/qt/qtvirtualkeyboard/tree/5.6/src

这是我的 Raspberry Pi 上的结果图片:

QtVirtualKeyboard 太大,顶部有黑色边框

于 2017-02-04T16:44:32.267 回答