2016-03-31 1 views
3

Je travaille sur un éditeur de texte écrit avec le moteur C++ et Qt pour l'interface utilisateur. Je veux permettre à l'utilisateur d'écrire avec n'importe quelle source d'entrée (clavier de n'importe quelle langue). Tout allait bien jusqu'au moment où je prenais en charge les langues, avec une fonction de clavier 1-1 (clavier français/russe, par exemple). J'ai eu un eventFilter installé sur mon Qwidget sur lequel je rends le texte et capturait les entrées du clavier dans QEvent::InputMethodouvrant un InputWindow sur OSX pour la saisie de texte tout en tapant du texte avec la langue asiatique

Mais je ne suis pas en mesure de soutenir toutes les fonctionnalités quand j'ai commencé avec les langues asiatiques (comme le japonais/chinois) Un exemple typique d'un tel cas est la division soulignée lorsque l'utilisateur écrit du texte avec japonais (Hiragana IME) et appuie sur la touche espace qui aide l'utilisateur à déterminer quels caractères doivent être remplacés par le contenu sur la prédiction dialog.See Image ci-dessous: some text written on TextEdit application with Japanese Input Method(Hiragana), notice the split underlines coming up when user hits a spacebar,:

après avoir lutté un moment, j'ai compris que Qt ne fournit pas assez d'informations sur les divisions ou la longueur de la chaîne qui est remplacé et j'abandonne l'idée de créer moi-même tous ces aspects visuels.

Mais ensuite, j'ai découvert que certaines applications utilisent une méthode d'entrée spécifique au système d'exploitation pour gérer un texte aussi complexe. Un exemple est le Finder OSX, si nous changeons la méthode d'entrée en japonais (Hiragana) et commençons à taper quand une fenêtre finder est mise au point, elle ouvre une fenêtre flottante qui accepte toutes mes entrées et la transmet au finder. Voir l'image ci-dessous enter image description here

je creuse plus et je me suis dit qu'il y avait un tel cadre qui était disponible plus tôt que les services de texte Manager avec beaucoup de documentation (« http://mirror.informatimago.com/next/developer.apple.com/technotes/te/te_27.html#Downloads ») qui aurait pu faire cette astuce très facilement pour moi MAIS cette API a été dépréciée et n'est plus disponible.

Ce que je cherche maintenant est une alternative pour cette API obsolète. Est-ce que tout le monde sait si nous avons une API de cacao qui peut m'aider à apporter ce composant de la méthode de saisie du système d'exploitation pour l'entrée de texte facile.

Toute aide/suggestion sont les bienvenues.

+0

Les classes 'QInputMethod' et les classes associées aident avec cela. –

Répondre

3

Ok, j'ai trouvé la solution. J'étais ignorant de dire que Qt ne fournit pas assez d'informations sur ces divisions. Qt a un moyen de fournir ce support en utilisant la position du curseur. Pour conclure, les informations du texte à afficher peuvent être facilement récupérées par:

for(auto value : inEvent->attributes()) 
    { 
     if(value.type == QInputMethodEvent::Cursor) 
     { 
      std::cout<<" length "<< value.length; 
      std::cout<<" start "<< value.start; 
     } 
    } 

Ici, début est la position du curseur. Une fois que cette position est claire, il est facile de déterminer combien de longueur de texte devrait être soulignée afin de donner une indication claire à l'utilisateur.