我目前正在尝试为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
{
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
}
}
当然,我做了一切必要的事情,使得在C ++和QML之间共享MyClass类型的对象myClass(作为上下文属性)。
现在,问题如下:无论我在上面的文本字段中输入什么,在Android下,最后一个字永远不会从myField.text传递给MyClass.m_Prop。例如,如果我在TextField中键入文本“我对此TextField不满意”,那么myClass.m_Prop将包含“我对此不满意”。但是,如果我键入“我对此TextField不满意”(注意空格)然后删除最后一个空格,则所需的字符串将存储在m_Prop变量中。
奇怪的是,这在Linux下运行得非常好。谁能告诉我这里缺少什么?我正在使用Qt 5.7和Android 6.0。
感谢您的帮助......
答案 0 :(得分:4)
据我理解对我的问题的评论,我有几个可能来解决这个问题。最简单的方法是修改我的QML项目:
ColumnLayout {
TextField {
id: myField
placeholderText: qsTr("Enter text")
Layout.fillWidth: true
Binding {
target: myClass
property: "prop"
value: myField.displayText
}
}
如果我不想允许预测文本输入,那么我可以添加
inputMethodHints: Qt.ImhNoPredictiveText
TextField上的。在我的情况下,我想要预测文本输入。
最后,当我点击我的应用程序的“完成”按钮时,我可以调用QInputMethod :: commit(),它将在Android上提交显示的文本,然后在MyClass中使用提交的文本。在这种情况下,我不应该使用QML的绑定功能。相反,我应该将数据提交给Android,然后将我的QML数据传递给myClass。
最适合QML理念的最简单的解决方案可能是使用displayText而不是text,这是我选择的解决方案。