android - 如何让 QML TextField 绑定(bind)在 Android 下工作?

标签 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
  {
    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 中键入文本“我对这个 TextField 不满意”,那么 myClass.m_Prop 将包含“我对这个不满意”。但是,如果我键入“我对这个 TextField 不满意”(注意空格)然后删除最后一个空格,则所需的字符串将存储在 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 上。就我而言,我想要预测文本输入。

最后,我可以在单击应用程序的“完成”按钮时调用 QInputMethod::commit(),这将在 Android 上提交显示的文本,然后在 MyClass 中使用提交的文本。在这种情况下,我不应该使用 QML 的绑定(bind)功能。相反,我应该只将数据提交到 Android,然后将我的 QML 数据传送到 myClass。

最符合 QML 哲学的最简单的解决方案可能是使用 displayText 而不是文本,这是我选择的解决方案。

关于android - 如何让 QML TextField 绑定(bind)在 Android 下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44088182/

相关文章:

c++ - 尝试在 Raspberry Pi 上运行交叉编译的 Qt 时出现 "Illegal instruction"(Windows)

c++ - 从抽象类的指针 vector 调用函数

android - xposed在线程中运行以hooked方法显示对话框

android - 来自 CustomCursorAdapter 的 RunOnUIThread

java - Android - 检索存储在 Cloud Firestore 文档中的自定义对象

c++ - 元素的每一个和的可能性

c++ - Qt - 什么是 QDockWidget::toggleViewAction 的常规小部件等价物

Java/Android 无法解释的编译错误 : is not abstract and does not override abstract method onTabReselected(Tab, FragmentTransaction) in TabListener

Java 与 C++(按引用调用?)

c++ - Windows MFC 宏