Qt / QML Android第三方虚拟键盘无法使用TextInput

时间:2014-03-26 20:41:32

标签: android qt keyboard qml

在使用Qt 5.2.1部署简单的测试应用程序时,Android上的第三方虚拟键盘似乎无法正常工作?我已经测试了所有可以接收文本输入的项目,总是相同的结果(TextInput,TextEdit甚至TextField和TextArea) 我在我的Android设备上使用SwiftKey Keyboard,我只能输入1个字符,下一个按键会替换整个文本(即使按下一个键之前有超过1个字符),同时按下空格键它出现一个随机键,没有空格,非常奇怪。 使用默认的android键盘,就我所知,没有问题,但我认为第三方键盘在android上被广泛使用,所以这可能是个问题。

这是一个已知的错误还是我错过了什么?

当设置“inputMethodHints:Qt.ImhNoPredictiveText”时效果更好,我可以输入内容但空间仍然无法正常工作,我也希望字典建议:) 由于我没有任何其他第三方键盘,我不知道问题是否仅适用于SwiftKey,但这是商店中最好的键盘之一。

代码示例:

import QtQuick 2.2

Rectangle {
    width: 360
    height: 360

    TextInput {
        anchors.fill: parent
        font.pointSize: 20
        text: "type here"
        //inputMethodHints: Qt.ImhNoPredictiveText
    }
}

我也在控制台输出中收到这些警告:

W/IInputConnectionWrapper( 8703): getExtractedText on inactive InputConnection
W/IInputConnectionWrapper( 8703): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper( 8703): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper( 8703): getTextAfterCursor on inactive InputConnection

3 个答案:

答案 0 :(得分:0)

应该在Qt 5.3.0 RC1中修复。目前Qt 5.3已经发布,所以值得一试。

答案 1 :(得分:0)

我目前正在使用QT5.5.1作为Android应用程序,而TextInput控件仍然存在捕获某些键盘事件的问题。

最初我在QQuickWidget中显示我的QML,这是基于qt小部件的gui的一部分。我遇到的问题是QML TextInput项没有从android键盘接收keypress事件。

namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{

=============================================== ======================

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file(":/styles/app_style.css");
    file.open(QFile::ReadOnly);
    QString styleSheet = QString::fromLatin1(file.readAll());
    a.setStyleSheet(styleSheet);
    MainWindow w;
    w.statusBar()->setHidden(true);
    w.show();
    return a.exec();
}

注意:不要浪费时间探索焦点或FocusScope。

作为一种解决方法,我使用QQuickView切换到完整的QML应用程序 哪个工作得很好,除了TextInput仍然没有响应时 按下数字键(0,1,2,3,...,9)。

在您的情况下发生的事情和可能发生的事情是,QQuickView keyPressEvent处理程序正在拾取数字键和第三方键盘按键事件的按键事件。

====== mainwindow.h ====================================== ================

class MainWindow : public QQuickView
{
    Q_OBJECT

public:
    explicit MainWindow(QWindow  *parent = 0);
    ~MainWindow();
    void keyPressEvent(QKeyEvent *event);

====== mainwindow.cpp ====================================== =============

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Back)
    {
        qDebug() << "[[Back button]]";

======的main.cpp ====================================== ===================

int main(int argc, char *argv[])
{
    QGuiApplication app(argc,argv);
    MainWindow view;
    view.show();
    return app.exec();
}

=============================================== =======================

答案 2 :(得分:0)

我不是Qt专家,但本周我遇到了这个问题。就像我用Google搜索一样,我发现它是一个错误,但我已经设法解决了这个问题。这是我的方法,您可以自己实施类似的关键事件。

 Item {
        Layout.fillHeight: true
        Layout.fillWidth: true
        id: rectDomain

        Rectangle {
            anchors.fill: parent
            anchors.margins: 2 * Screen.pixelDensity
            border.width: 1
            border.color: "#916E34"

            TextEdit {
                id: txtDomain
                property int lastCursorIndex: 0
                anchors.fill: parent
                horizontalAlignment: Qt.AlignHCenter
                verticalAlignment: Qt.AlignVCenter
                font.pointSize: 16
                text: controller.domain //"192.168.20.57"
                inputMethodHints: Qt.ImhNoPredictiveText
                //                    wrapMode: TextEdit.WrapAnywhere
                //                    color: "#0B151E"
                focus: true
                Keys.onReleased: {
                    if (event.key == Qt.Key_Backspace)
                    {
                        txtDomain.lastCursorIndex = txtDomain.selectionStart
                        console.log("Selection Test... Selection Start : " + txtDomain.lastCursorIndex + "Selection End" + txtDomain.selectionEnd)
                        if (txtDomain.selectionStart == txtDomain.selectionEnd) // Remove single character
                        {
                            text = text.substring(0, cursorPosition-1) + text.substring(cursorPosition, text.length)
                            cursorPosition = txtDomain.lastCursorIndex- 1
                        }
                        else                                                        // Remove selected part from text.
                        {

                            text = text.substring(0, txtDomain.selectionStart) + text.substring(txtDomain.selectionEnd, text.length)
                            cursorPosition =  txtDomain.lastCursorIndex
                        }

                    }
                    else
                        console.log("It is not the Backspce... Might be Space Enter UppoerCase, Change Language Button")

                }
            }

        }

    }

只是一个提示,在我的方法中,我需要在摆脱它们之前选择部分。所以我需要设置焦点:true

希望这会对你有所帮助, 此致。