2017-05-20 1 views
0

Ich versuche derzeit, eine QML/C++ - Anwendung für Android zu schreiben. Irgendwo in meinem Code, habe ich eine Klasse, die wie folgt aussieht:Wie funktioniert die QML TextField-Bindung unter Android?

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; 
}; 

Somwhere in meiner QML Sache, ich habe einen Artikel in der folgenden Weise definiert:

ColumnLayout { 
    TextField { 
    id: myField 
    placeholderText: qsTr("Enter text") 
    Layout.fillWidth: true 
    Binding { 
     target: myClass 
     property: "prop" 
     value: myField.text 
    } 
} 

Natürlich, ich habe alles notwendig, um das Objekt myClass vom Typ MyClass zwischen C++ und QML (als Context-Eigenschaft) zu machen.

Jetzt ist das Problem das Folgende: was auch immer ich im obigen Textfeld unter Android eingeben, wird das letzte Wort nie von MyField.text zu MyClass.m_Prop kommuniziert. Wenn ich beispielsweise den Text "Ich bin mit diesem TextFeld nicht zufrieden" im TextField eintippte, enthält myClass.m_Prop "Ich bin nicht zufrieden damit". Wenn ich jedoch "Ich bin nicht zufrieden mit diesem TextField" (beachten Sie das Leerzeichen) eingeben und dann das letzte Leerzeichen entfernen, wird die gewünschte Zeichenfolge in der Variable m_Prop gespeichert.

Seltsam ist, dass das unter Linux einwandfrei funktioniert. Kann mir jemand sagen, was ich hier vermisse? Ich arbeite mit Qt 5.7 und Android 6.0.

Danke für Ihre Hilfe ...

+0

Beachten Sie, dass auf dem Android-Emulator funktioniert das auch ganz gut. –

+1

Der Grund ist, dass der Text auf Android noch nicht festgeschrieben ist, siehe ['QInputMethod'] (http://doc.qt.io/qt-5/qinputmethod.html) für weitere Informationen, insbesondere [' commit'] (http://doc.qt.io/qt-5/qinputmethod.html#commit). – m7913d

+1

Versuchen Sie 'displayText' anstelle von' text' zu verwenden. Ersteres enthält partielle Texteingabe von einer Eingabemethode. – jpnurmi

Antwort

3

Soweit ich die Kommentare auf meine Frage verstehen, habe ich ein paar Möglichkeiten, dieses Problem zu lösen. Die einfachste ist meine QML Artikel wie folgt zu ändern:

ColumnLayout { 
    TextField { 
    id: myField 
    placeholderText: qsTr("Enter text") 
    Layout.fillWidth: true 
    Binding { 
     target: myClass 
     property: "prop" 
     value: myField.displayText 
    } 
} 

Wenn ich nicht prädiktive Texteingabe ermöglichen wollte, dann konnte ich nur die

inputMethodHints: Qt.ImhNoPredictiveText 

auf dem TextField-

hinzuzufügen. In meinem Fall möchte ich vorhersagende Texteingabe.

Zuletzt konnte ich QInputMethod :: commit() aufrufen, wenn ich auf die Schaltfläche "Done" meiner Anwendung klicke, die den angezeigten Text auf Android festschreibt und dann den festgeschriebenen Text in MyClass verwendet. In diesem Fall sollte ich die Binding-Funktion von QML nicht verwenden. Stattdessen sollte ich die Daten nur an Android übergeben und dann meine QML-Daten an myClass übermitteln.

Die einfachste Lösung, die am besten zur QML-Philosophie passt, ist wahrscheinlich die Verwendung von displayText anstelle von Text, was die Lösung ist, die ich wählen möchte.

Verwandte Themen