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:
PointPickingCallback
de PointPickingCallback
une nouvelle classe qui remplace la vérification de la touche shift dans la méthode Execute
. 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. 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.