2011-08-12 17 views
2

アップ/ダウン/左/右/選択ボタンしかないQt/Embeddedデバイスにデータ入力画面があります。画面は、QLineEditが一番上にあり、QPushButtonsがセットされた電卓のように見えます。 UDLRボタンはQPushButtonsの周りのフォーカスを移動し、selectはボタンの番号をQLineEditに追加します。これは素晴らしいです。ただし、QLineEditにはフォーカスがないため、テキスト入力カーソルは点滅しません。 QLineEditは、仮想キーボードのボタンが押されたときの受信者のようには見えず、それは良くありません。UDLRボタンのみで動作する仮想キーボードのQtフォーカス処理

私が見た他のQt仮想キーボードの実装では、タッチまたはマウス操作であるため、キーボードボタンがフォーカスを得る必要はありません。したがって、QLineEditは、時間全体にわたってフォーカスを保持することができます。これはオプションではありません。私が今見たことのあるところは、QLineEditがユーザーが実際に仮想キーボードを操作しているときに焦点を当てていると思うように、フォーカスイベントを手動で生成することです。私は、より洗練された解決策、あるいはこの問題を回避する画面の実装を構成するための別の方法があることを期待しています。何か案は?

答えて

1

真の編集機能がQLineEditである必要はないようですので、QLabelに置き換えてください。フレームの中に入れて編集ボックスのようにすることができます。次に、作業に焦点を当てる必要がないQTimerを使用して点滅カーソルをシミュレートすることができます。

タイマーを500ms間隔で開始し、タイマースロットで '|'を挿入または削除します。このような文字:あなたの選択ボタンを押すと

void MainWindow::slot_timeout() 
{ 
    QString labelText = label->text();  
    if(labelText.right(1) == "|") 
    { 
     labelText = labelText.left(labelText.size()-1); 
    } 
    else 
    { 
     labelText += "|"; 
    }  
    label->setText(labelText); 
} 

、点滅カーソルが右端に留まるように、文字列の先頭に適切な文字を挿入します。

void MainWindow::slot_selectClick() 
{ 
    QString labelText = label->text(); 
    labelText.prepend("x"); 
    label->setText(labelText); 
} 

あなたが探している効果を達成するのに十分かもしれません。

+0

これは私にとって良い方法かもしれません。もう少しコードがあるとしても、手動でフォーカスイベントを 'QLineEdit'に送るよりも気持ちが良いです。 Qtには、既存のウィジェットを使用する必要があるようなサブフォーカスやデュアルフォーカスを指定する方法がないという結論に達しています。そうした場合、複雑になります。あなたのソリューションには、本当に理解しやすいという利点があります。 –

+1

他の誰かが同じ問題を抱えている場合、私はこの記事をフォローしています。私は 'QLineEdit'を使って手動でフォーカスイベントを送信しました。なぜなら、 'QLabel'の解決策は、特に、入力ボックスがいっぱいになったときにカーソルの位置を正しく見せるようにするのは難しく、' QLineEdit'では右から左への言語の国際化のサポートがずっと簡単でした。 –

+0

これは重要な考慮事項です。特に有用なコードがある場合は、回答として投稿することができれば良いでしょう。あなた自身の答えを "受け入れる"ことは、まったく受け入れられます:) –

関連する問題