2016-05-27 5 views
0

Ich habe wie einen QML LineEdit erzeugt ändern:Wie QML TextField- Texteigenschaft mit Schlüsselereignissen von C++

TextField 
{ 
    id: testEdit 
    text: "0" 
    Keys.onPressed: 
    { 
    console.log("Press = " + event.key) 
    console.log("Current text is " + text) 
    } 
    Keys.onReleased: 
    { 
    console.log("Release = " + event.key) 
    console.log("Current text is " + text) 
    } 
} 

Ich mag seine Texteigenschaft durch die Simulation von Tastenereignis ändern. So habe ich C++ Objekt (Eventhandler) auf QML ausgesetzt Erzeugung Schlüsselereignisse:

void normalKeyPress(QQuickItem *receiver, QString keys) 
{ 
    receiver->forceActiveFocus(); 

    QKeySequence keysSeq = QKeySequence(keys); 
    for (auto idx = 0; idx < keysSeq.count(); ++idx) 
    { 
    auto keyCode = keysSeq[idx]; 
    auto keyEvent = new QKeyEvent(QEvent::KeyPress, keyCode, Qt::NoModifier); 
    auto keyEventSent = QApplication::sendEvent(receiver, keyEvent); 

    keyEvent = new QKeyEvent(QEvent::KeyRelease, keyCode, Qt::NoModifier); 
    keyEventSent = QApplication::sendEvent(receiver, keyEvent); 
    } 
} 

Jetzt in QML, wenn ich das tue:

testEdit.forceActiveFocus() 
eventHandler.normalKeyPress(testEdit, "4") 
eventHandler.normalKeyPress(testEdit, "Enter") 

ich die folgende Ausgabe:

qml: Press = 52 
qml: Current text is 0 
qml: Release = 52 
qml: Current text is 0 
qml: Press = 16777221 
qml: Current text is 0 
qml: Release = 16777221 
qml: Current text is 0 

So werden wichtige Ereignisse vom QML LineEdit korrekt empfangen.

Aber warum Text Eigenschaft wird nicht entsprechend aktualisiert?

UPDATE # 1: wenn ich einen TextInput anstelle eines TextField verwenden, dann funktioniert es wie erwartet.

+0

Haben Sie LineEdit selbst erstellt? Ich kann die Dokumentation auf der Qt-Website nicht finden. –

+0

@ JeffreyvandeGlind: oups, falsche copy-paste-edit. Mit einem TextField erhalten Sie die gleichen Ergebnisse. Ich habe meine Frage bearbeitet. Netter Fang, danke! – Korchkidu

+0

Hat das 'TextField' aktiven Fokus? Rufen Sie 'forceActiveFocus' auf oder setzen Sie' focus' auf 'true'. – GrecKo

Antwort

0

Nun, mit Blick auf Ihren Code, denke ich, die Lösung in setProperty() Methode zu Ihrem reciever hinzuzufügen. Ihr Code lautet also:

void normalKeyPress(QQuickItem *receiver, QString keys) 
{ 
    receiver->forceActiveFocus(); 
    receiver->setProperty("text", keys); 

    <...> 
} 
+0

Das würde funktionieren, aber ich möchte wichtige Ereignisse verwenden. – Korchkidu

+0

Sie senden Ereignis und in qml fangen Sie nur ein anderes Ereignis, ohne eine Eigenschaft als Text festzulegen. Sie können 'keyCode' nur als' text' -Eigenschaft im Handler setzen, aber es wird Code sein, nicht der Name eines Schlüssels. Oder Sie können andere Signale von qml abfangen, die von der 'normalKeyPress' Methode gesendet werden. – someoneinthebox

+0

Dies ist für Testzwecke. Also muss ich Ereignisse an meine QML-Komponenten senden. Diese müssen so reagieren, als hätte ich "4" eingegeben. Ich will nur nicht nur den Wert festlegen. – Korchkidu