如何使 QML TextField 绑定在 Android 下工作?
How to make QML TextField binding work under Android?
我目前正在尝试为 Android 编写 QML/C++ 应用程序。在我的代码中的某处,我有一个 class 看起来像这样:
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;
};
在我的 QML 文件中的某处,我有一个按以下方式定义的项目:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.text
}
}
当然,我做了所有必要的事情来使 MyClass 类型的对象 myClass 在 C++ 和 QML 之间共享(作为上下文 属性)。
现在,问题如下:无论我在上面的文本字段中输入什么,在 Android 下,最后一个词都不会从 myField.text 传达给 MyClass.m_Prop。例如,如果我在 TextField 中键入文本 "I am not happy with this TextField",则 myClass.m_Prop 将包含 "I am not happy with this"。但是,如果我键入 "I am not happy with this TextField "(注意 space)然后删除最后一个 space,那么所需的字符串将存储在 m_Prop 变量中。
奇怪的是,这在 Linux 下工作得很好。有人可以告诉我我在这里缺少什么吗?我正在使用 Qt 5.7 和 Android 6.0.
感谢您的帮助...
据我了解对我的问题的评论,我有几种可能性来解决这个问题。最简单的是像这样修改我的 QML 项目:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.displayText
}
}
如果我不想允许预测文本输入,那么我可以添加
inputMethodHints: Qt.ImhNoPredictiveText
在 TextField 上。就我而言,我想要预测文本输入。
最后,当我单击我的应用程序的按钮 "Done" 时,我可以调用 QInputMethod::commit(),这将在 Android 上提交显示的文本,然后在中使用提交的文本我的课。在这种情况下,我不应该使用 QML 的绑定功能。相反,我应该只将数据提交到 Android,然后将我的 QML 数据传送到 myClass。
最符合 QML 哲学的最简单的解决方案可能是使用 displayText 而不是文本,这就是我选择的解决方案。
我目前正在尝试为 Android 编写 QML/C++ 应用程序。在我的代码中的某处,我有一个 class 看起来像这样:
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;
};
在我的 QML 文件中的某处,我有一个按以下方式定义的项目:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.text
}
}
当然,我做了所有必要的事情来使 MyClass 类型的对象 myClass 在 C++ 和 QML 之间共享(作为上下文 属性)。
现在,问题如下:无论我在上面的文本字段中输入什么,在 Android 下,最后一个词都不会从 myField.text 传达给 MyClass.m_Prop。例如,如果我在 TextField 中键入文本 "I am not happy with this TextField",则 myClass.m_Prop 将包含 "I am not happy with this"。但是,如果我键入 "I am not happy with this TextField "(注意 space)然后删除最后一个 space,那么所需的字符串将存储在 m_Prop 变量中。
奇怪的是,这在 Linux 下工作得很好。有人可以告诉我我在这里缺少什么吗?我正在使用 Qt 5.7 和 Android 6.0.
感谢您的帮助...
据我了解对我的问题的评论,我有几种可能性来解决这个问题。最简单的是像这样修改我的 QML 项目:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.displayText
}
}
如果我不想允许预测文本输入,那么我可以添加
inputMethodHints: Qt.ImhNoPredictiveText
在 TextField 上。就我而言,我想要预测文本输入。
最后,当我单击我的应用程序的按钮 "Done" 时,我可以调用 QInputMethod::commit(),这将在 Android 上提交显示的文本,然后在中使用提交的文本我的课。在这种情况下,我不应该使用 QML 的绑定功能。相反,我应该只将数据提交到 Android,然后将我的 QML 数据传送到 myClass。
最符合 QML 哲学的最简单的解决方案可能是使用 displayText 而不是文本,这就是我选择的解决方案。