如何使QML文本字段绑定在Android下工作?
我目前正在尝试为Android编写一个QML/C++应用程序。在我的代码中,我有一个类,它看起来像这样:如何使QML文本字段绑定在Android下工作?,android,c++,qt,qml,textfield,Android,C++,Qt,Qml,Textfield,我目前正在尝试为Android编写一个QML/C++应用程序。在我的代码中,我有一个类,它看起来像这样: class MyClass : public QObject { Q_OBJECT Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged) public: explicit MyClass(QObject* a_Parent = 0); QString prop() const {
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged)
public:
explicit MyClass(QObject* a_Parent = 0);
QString prop() const
{
return m_Prop;
}
void setProp(const QString& a_Value)
{
m_Prop = a_Value;
emit propChanged();
}
signals:
void propChanged();
private:
QString m_Prop;
};
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.displayText
}
}
因此,在我的QML资料中,有一个项是用以下方式定义的:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.text
}
}
当然,我做了所有必要的事情来让对象MyClass类的对象在C++和QML之间共享(作为上下文属性)。p>
现在,问题是:无论我在上面的文本字段中键入什么,在Android下,最后一个单词永远不会从myField.text传递到MyClass.m_Prop。例如,如果我在TextField中键入文本“我不喜欢这个TextField”,那么myClass.m_Prop将包含“我不喜欢这个”。但是,如果我键入“我对这个文本字段不满意”(注意空格),然后删除最后一个空格,那么所需的字符串将存储在m_Prop变量中
奇怪的是,这在Linux下工作得非常好。有人能告诉我这里缺少什么吗?我正在使用Qt5.7和Android 6.0
谢谢你的帮助……据我所知,对我的问题的评论,我有一些可能解决这个问题。最简单的方法是修改我的QML项,如下所示:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged)
public:
explicit MyClass(QObject* a_Parent = 0);
QString prop() const
{
return m_Prop;
}
void setProp(const QString& a_Value)
{
m_Prop = a_Value;
emit propChanged();
}
signals:
void propChanged();
private:
QString m_Prop;
};
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.displayText
}
}
如果我不想允许预测性文本输入,那么我可以添加
inputMethodHints: Qt.ImhNoPredictiveText
在文本字段上。在我的例子中,我需要预测性文本输入
最后,当我单击应用程序的“完成”按钮时,我可以调用QInputMethod::commit(),它将在Android上提交显示的文本,然后在MyClass中使用提交的文本。在这种情况下,我不应该使用QML的绑定特性。相反,我应该将数据提交给Android,然后将我的QML数据传递给myClass
最符合QML理念的最简单的解决方案可能是使用displayText而不是text,这是我选择的解决方案 请注意,在android emulator上,这也可以正常工作。原因是文本尚未在android上提交,请参阅以了解更多信息,尤其是。尝试使用
displayText
而不是text
。前者包括来自输入法的部分文本输入。或者,如果您不需要预测性文本输入,请在TextField
上设置inputMethodHints:Qt.ImhNoPredictiveText
。谢谢,现在可以使用displayText。我理解您的其他输入,这些输入对我理解此特定功能非常有价值!