2016-05-27 7 views
0

から生成されたキーイベントを使用してQMLのTextFieldのテキストプロパティを変更するには私のようなQMLのLINEEDITを持っています。私が行うとき、QMLで今はどのようにC++

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

:だから私は、C++オブジェクト(EventHandlerは)キーイベントを発生させるQMLにさらされてい

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

私は、取得するには、次の出力:

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 

したがって、キーイベントはQML LineEditによって正しく受信されます。

なぜテキストプロパティがそれに応じて更新されないのですか?

UPDATE#1:私は代わりにTextFieldTextInputを使用する場合に予想されるよう、それは動作します。

+0

LineEditを自分で作成しましたか?私はQtのWebサイトでドキュメントを見つけることができません。 –

+0

@JeffreyvandeGlind:oups、間違ったコピー貼り付け編集。 TextFieldを使用すると、同じ結果が得られます。私は私の質問を編集しました。ニースキャッチ、ありがとう! – Korchkidu

+0

'TextField'はアクティブなフォーカスを持っていますか? 'forceActiveFocus'を呼び出すか、少なくとも' focus'を 'true'に設定してください。 – GrecKo

答えて

0

あなたのコードを見ると、私はsetProperty()メソッドをrecieverに追加するという解決策だと思います。したがって、コードは次のようになります。

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

    <...> 
} 
+0

それはうまくいくが、キーイベントを使いたい。 – Korchkidu

+0

あなたはイベントを送信し、qmlではプロパティをテキストとして設定せずに別のイベントを捕捉するだけです。ハンドラでは 'keyCode'を' text'プロパティとして設定できますが、キーの名前ではなくコードになります。あるいは、 'normalKeyPress'メソッドから送られるqmlで他のシグナルを捕まえることができます。 – someoneinthebox

+0

これはテスト目的です。だから私はQMLコンポーネントにイベントを送る必要があります。それらは私がそれに「4」をタイプしたように反応しなければならない。私は値を設定したいだけではありません。 – Korchkidu