Comment simuler une pression sur le clavier. Qt, Windows 10

Je développe des logiciels pour une tablette tactile. L’unité n’a pas de clavier et n’a qu’un écran tactile (l’écran tactile émule une souris). Le système d’exploitation est Windows 10 et nous utilisons Qt comme interface graphique utilisateur.

Nous nous appuyons sur une bibliothèque de classes de la bibliothèque de nuages ​​de points qui possède un composant qui nécessite que la touche SHIFT soit enfoncée pour que quelque chose se produise lorsque nous effectuons un clic gauche sur la souris.

Je dois faire en sorte que le composant logiciel sous-jacent pense que la touche SHIFT a été enfoncée.

J’ai essayé d’envoyer des événements de frappe au widget Qt via “Qt means”, mais la fausse touche SHIFT ne semble pas atteindre le sw sous-jacent. composant. Comme il est probablement dans une bibliothèque de classes non apparentée à Qt et que cette bibliothèque de classes logicielles vérifie probablement les événements clés différemment (par exemple, via des appels de système d’exploitation, des méthodes standard st + ou similaires).

Cela n’a pas semblé fonctionner en essayant le “Qt way”:

QKeyEvent key_press(QEvent::KeyPress, Qt::Key_Shift, Qt::ShiftModifier); QApplication::sendEvent(ui->qvtkWidget, &key_press); 

Par conséquent, je dois probablement utiliser une méthode du système d’exploitation pour simuler une pression sur une touche SHIFT.

Question: Comment puis-je faire un appel système du système d’exploitation ou similaire depuis Qt pour que le composant logiciel sous-jacent pense qu’une touche SHIFT a été maintenue enfoncée (l’utilisateur appuie simultanément sur le bouton gauche de la souris)?

Ce que vous voulez, ce n’est pas de simuler une entrée de touche Maj, mais de désactiver la vérification du décalage au niveau de l’interaction. Définitivement un problème XY.

Les classes vtk InteractorStyle sont responsables de la gestion des événements de saisie utilisateur. Vous pouvez le voir à la ligne 506 de pcl_visualizer.cpp

 boost::signals2::connection pcl::visualization::PCLVisualizer::registerPointPickingCallback (boost::function callback) { return (style_->registerPointPickingCallback (callback)); } 

le rappel est enregistré dans une classe PCLVisualizerInteractorStyle .

Vous pouvez passer votre propre style d’interaction personnalisé lors de la construction de PCLVisualizer afin que celui-ci puisse être modifié en toute sécurité. Le constructeur à utiliser est celui- ci

 PCLVisualizer (int &argc, char **argv, const std::ssortingng &name="", PCLVisualizerInteractorStyle *style=PCLVisualizerInteractorStyle::New(), const bool create_interactor=true) 

La classe PointPickingCallback est ajoutée automatiquement en tant que rappel de la souris lors de l’initialisation du style d’interacteur par défaut. Donc, pour remplacer ce comportement, vous devez dériver votre propre classe de PCLVisualizerInteractorStyle et remplacer la méthode Initialize() et transmettre ce nouveau style d’interaction à un PCLVisualizer lors de la construction.

La méthode Execute à l’intérieur de PointPickingCallback est l’endroit où la vérification de la touche shift est effectuée.

 void pcl::visualization::PointPickingCallback::Execute (vtkObject *caller, unsigned long eventid, void*) { PCLVisualizerInteractorStyle *style = reinterpret_cast(caller); vtkRenderWindowInteractor* iren = reinterpret_cast(caller)->GetInteractor (); if (style->CurrentMode == 0) { if ((eventid == vtkCommand::LeftButtonPressEvent) && (iren->GetShiftKey () > 0)) { float x = 0, y = 0, z = 0; int idx = performSinglePick (iren, x, y, z); // Create a PointPickingEvent if a point was selected [... and so on] 

En résumé, vous devrez:

  1. PointPickingCallback de PointPickingCallback une nouvelle classe qui remplace la vérification de la touche shift dans la méthode Execute .
  2. PCLVisualizerInteractorStyle de PCLVisualizerInteractorStyle et remplacez la méthode Initialize pour enregistrer votre nouvelle classe PointPickingCallback personnalisée qui ne vérifie pas la touche shift, en tant que rappel de souris.
  3. PCLVisualizer le nouveau style interactif à PCLVisualizer .

À noter. Le visualiseur prend en charge deux modes de sélection: la bande de caoutchouc pour la sélection de la zone et la sélection du point unique, qui peut être interchangée en appuyant sur la touche «x». Je pense que la sélection par défaut est la bande de caoutchouc et c’est pourquoi elle pourrait vérifier si cette touche de changement de vitesse est pressée en premier lieu.