在使用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
答案 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
希望这会对你有所帮助, 此致。