较长版本
我正在使用WebGL作为平台的浏览器中运行QML应用程序。一切工作正常,直到我尝试集成QtVirtualKeyboard来填充一些文本字段和可编辑的ComboBox。在浏览器中运行项目时,收到的第一条消息是:

This plugin does not support dynamic OpenGL loading!
我怀疑此错误消息/警告未链接到VirtualKeyboard(VK),因为删除VK的所有痕迹不会使消息消失。浏览器窗口的屏幕截图可以在下面查看。

c++ - QtVirtualKeyboard使用平台WebGL卡住了QML应用程序,但是桌面工作正常。如何解冻或解决它?-LMLPHP

单击文本输入字段时,将显示下一条消息:
This plugin does not support setting window masks
屏幕的一半保持黑色-这是VK刷新所在的区域。再次-下面的屏幕截图。

c++ - QtVirtualKeyboard使用平台WebGL卡住了QML应用程序,但是桌面工作正常。如何解冻或解决它?-LMLPHP

刷新后,又出现三则消息。我将省略前两个,因为它们基本上是在说“您按下了Alt键和F5键”。第三个消息是:
requestActivate() called for  QtVirtualKeyboard::InputView(0x4a16590)  which has Qt::WindowDoesNotAcceptFocus set.
现在,键盘可见,但是每次在VK上敲击键盘时,都会出现新消息,而文本中不会写入任何文本:
This plugin does not support setting window masks
This plugin does not support setting window masks
qt.virtualkeyboard: InputContext::sendKeyClick(): no focus to send key click - QGuiApplication::focusWindow() is: QtVirtualKeyboard::InputView(0x4a16590)
This plugin does not support setting window masks
除此之外,一旦项目处于此状态,来自键盘的输入似乎将被忽略。硬重置(关闭程序并重新启动)将功能恢复到被调用的VK,刷新页面不会触发任何文本出现在文本字段中。我得到的最终 View 如下所示:

c++ - QtVirtualKeyboard使用平台WebGL卡住了QML应用程序,但是桌面工作正常。如何解冻或解决它?-LMLPHP

我创建了一个最小的示例来演示该问题。它是由Qt Creator 4.13.2创建的经过稍微修改的空QML项目。
在 table 面上运行它应该可以工作,如果项目收到命令行参数-platform webgl:port=80,则会出现有问题的行为。我正在使用MSVC2019 32位和Qt 5.15.1。该问题在Microsoft Edge 44.18362.387.0和Firefox 68.5.0esr(32位)中是可重现的。
Chrome版本86.0.4240.111(64位)略有不同:输入未直接显示时,刷新网页随后输入了内容。但是,最小化键盘是行不通的,因此这不是解决方案。
# TestVirtualKeyboard.pro (autogenerated by QtCreator)
QT += quick virtualkeyboard

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
  qputenv("QSG_RENDER_LOOP", "threaded"); // Addendum for Windows, does not change the problematic behavior
  qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;
  const QUrl url(QStringLiteral("qrc:/main.qml"));
  QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                   &app, [url](QObject *obj, const QUrl &objUrl) {
    if (!obj && url == objUrl)
      QCoreApplication::exit(-1);
  }, Qt::QueuedConnection);
  engine.load(url);

  return app.exec();
}

// main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.VirtualKeyboard 2.15
import QtQuick.Controls 2.5

Window {
    id: window
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    color: "grey"

    TextInput {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: parent.top
        width: 320
        height: 30

        Rectangle {
            anchors.centerIn: parent
            width: parent.width + 4
            height: parent.height + 4
            color: "white"
            border.color: "black"
            border.width: 1
            radius: 2
            z: -1
        }
    }
}

TL,DR:
如果在 table 面应用程序中运行,则QtVirtualKeyboard可以工作,但是如果平台是WebGL并且选择了可编辑的文本元素,则QtVirtualKeyboard会卡住该应用程序。
问题:
有没有一种方法可以让QtVirtualKeyboard在Qt/WebGL应用程序中运行,或者有另一种方法/工具可以用于在Touch设备上获得Qt/WebGL应用程序的键盘功能?
不必编写我自己的键盘元素的加点。
到目前为止我已经尝试过:
  • 我搜索了一些流行的搜索引擎,但结果很短。
  • 多个浏览器,未获得令人满意的成功。
  • 发现了一些与Unity有关的问题,这可能是另一个论坛的一个问题。这些似乎不适用于我的问题,因为我怀疑Qt/QML/WebGL和Unity/WebGL会大不相同,而且我对Unity没有任何经验。
  • 我不确定这个问题是如何关联的:QT WebGL-stream, virtualKeyboard and touch screen problem
  • 最佳答案

    在Qt支持的帮助下,我开始工作了。我这样做的方法是,调用Qt虚拟键盘会导致应用程序尝试使键盘成为应用程序顶部的顶级窗口。这也是台式机机箱的处理方式,但是可以正常工作。
    为了避免这种现象,必须将键盘嵌入QML窗口中。为此,可以将InputPanel添加到QML窗口中,如下所示:

    import QtQuick 2.15
    import QtQuick.Window 2.15
    import QtQuick.VirtualKeyboard 2.15
    import QtQuick.Controls 2.5
    
    Window {
        id: window
        width: 640
        height: 480
        visible: true
        title: qsTr("Hello World")
        color: "grey"
    
        TextInput {
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.top: parent.top
            width: 320
            height: 30
    
            Rectangle {
                anchors.centerIn: parent
                width: parent.width + 4
                height: parent.height + 4
                color: "white"
                border.color: "black"
                border.width: 1
                radius: 2
                z: -1
            }
        }
    
        InputPanel {
            width: window.width
            y: window.height - height
            visible: active
        }
    }
    
    这帮了我大忙。

    关于c++ - QtVirtualKeyboard使用平台WebGL卡住了QML应用程序,但是桌面工作正常。如何解冻或解决它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64589978/

    10-13 06:55