2011-08-12 2 views
2

J'ai un écran de saisie de données sur un appareil Qt/Embedded qui n'a que des boutons haut/bas/gauche/droite/sélection. L'écran ressemble à une calculatrice avec un QLineEdit en haut et un ensemble de QPushButtons pour les nombres. Les boutons UDLR déplacent le focus autour des boutons QPushButtons et sélectionnent l'ajout du numéro du bouton au QLineEdit. Cela fonctionne très bien. Cependant, comme le QLineEdit n'a pas de focus, le curseur d'entrée de texte ne clignote pas. Le QLineEdit n'a pas l'air d'être le destinataire des pressions du bouton du clavier virtuel et ce n'est pas bon.Gestion du focus Qt pour clavier virtuel fonctionnant uniquement par boutons UDLR

Les autres implémentations de claviers virtuels Qt que j'ai vues n'ont pas besoin de boutons de clavier pour obtenir le focus car elles sont actionnées par le toucher ou la souris. Par conséquent, QLineEdit peut conserver le focus tout le temps. Ce n'est pas une option ici. Le meilleur que j'ai vu jusqu'ici est la génération manuelle des événements de mise au point pour tromper le QLineEdit en pensant qu'il a l'accent quand l'utilisateur navigue réellement autour du clavier virtuel. J'espère qu'il existe une solution plus élégante ou peut-être une façon différente de structurer la mise en œuvre de l'écran qui évite ce problème. Des idées?

Répondre

1

Comme il semble que vous n'avez pas besoin des vraies capacités d'édition de QLineEdit, remplacez-le par un QLabel. Vous pouvez l'imbriquer dans un cadre pour lui donner l'apparence d'une zone d'édition. Ensuite, vous pouvez simuler un curseur clignotant en utilisant un QTimer qui n'a pas besoin de mise au point pour fonctionner.

Démarrer la minuterie avec un intervalle de 500 ms et dans la fente de la minuterie, insérer ou retirer un '|' caractère comme ceci:

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

Lorsque votre bouton de sélection est enfoncé, insérer le caractère approprié à l'avant de la chaîne de sorte que le curseur clignotant reste à l'extrémité droite.

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

Cela pourrait être suffisant pour obtenir l'effet recherché.

+0

Cela peut être un bon moyen pour moi d'y aller. Cela semble préférable à l'envoi manuel d'événements focus à QLineEdit, même si c'est un peu plus de code. J'en arrive à la conclusion que Qt n'a pas le moyen de spécifier un sous-focus ou un double focus comme ce dont j'aurais besoin pour utiliser les widgets existants, et si c'était le cas, cela serait compliqué. Votre solution a l'avantage d'être vraiment facile à comprendre. –

+1

Je suis sur ce post au cas où quelqu'un d'autre le rencontrerait avec le même problème. J'ai fini par utiliser 'QLineEdit' et envoyer manuellement des événements de focus. Deux raisons: la solution 'QLabel' était délicate pour donner un aspect correct à l'alignement du curseur, surtout quand la boîte d'entrée était remplie, et le support de l'internationalisation pour les langues de droite à gauche était tellement plus facile avec' QLineEdit'. –

+0

Ce sont des considérations importantes. Ce serait bien si vous pouviez afficher cela comme une réponse, surtout s'il y a un code utile. Il est parfaitement acceptable "d'accepter" votre propre réponse ici :) –