[C++ : Qt]Simuler appuie touche clavier
Fermé
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
-
21 févr. 2010 à 16:31
JazzJackrabbit - 9 févr. 2015 à 15:55
JazzJackrabbit - 9 févr. 2015 à 15:55
Bonjour,
je souhaiterai pouvoir faire un mini clavier affiché sur l'écran en C++ : lorsque l'on clique sur le bouton 'A', cela simule un véritable appuie sur une touche. J'aimerai bien le faire avec Qt ou l'extension Qxt pour que mon programme soit compatible linux.
Savez vous comment simuler l'appuie d'une touche clavier via QT ?
Merci d'avance.
je souhaiterai pouvoir faire un mini clavier affiché sur l'écran en C++ : lorsque l'on clique sur le bouton 'A', cela simule un véritable appuie sur une touche. J'aimerai bien le faire avec Qt ou l'extension Qxt pour que mon programme soit compatible linux.
Savez vous comment simuler l'appuie d'une touche clavier via QT ?
Merci d'avance.
16 réponses
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
21 févr. 2010 à 22:37
21 févr. 2010 à 22:37
Par exemple pour envoyer la touche 'Tab':
QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier); QApplication::sendEvent(this, &event);Bonne continuation.
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
3 mars 2010 à 17:19
3 mars 2010 à 17:19
Ah tu veux envoyer une touche à une autre application !
Alors il te faut choisir un autre mode de communication, par exemple D-Bus; tu as de la chance, ce mode est implémenté dans Qt.
Voir la doc.
Alors il te faut choisir un autre mode de communication, par exemple D-Bus; tu as de la chance, ce mode est implémenté dans Qt.
Voir la doc.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 mars 2010 à 16:53
3 mars 2010 à 16:53
ça dépend de qui tu veux qui récupère le signal TAB.
Là c'est l'application, mais il faut savoir ce qu'elle doit en faire de ce signal TAB.
Là c'est l'application, mais il faut savoir ce qu'elle doit en faire de ce signal TAB.
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
3 mars 2010 à 16:57
3 mars 2010 à 16:57
Salut petit programmeur ;-)
Et qu'est-ce qui te dit que la touche n'est pas envoyée... à 'this', c'est-à-dire, dans ton cas, à un objet 'MainWindow' et c'est-à-dire à l'objet qui veut simuler une touche. Pour le recevoir, il faut redéfinir une fonction 'keyPressEvent'.
En général, on ne s'envoie pas une touche, on l'envoie à un autre objet.
Bonne continuation.
Et qu'est-ce qui te dit que la touche n'est pas envoyée... à 'this', c'est-à-dire, dans ton cas, à un objet 'MainWindow' et c'est-à-dire à l'objet qui veut simuler une touche. Pour le recevoir, il faut redéfinir une fonction 'keyPressEvent'.
En général, on ne s'envoie pas une touche, on l'envoie à un autre objet.
Bonne continuation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
3 mars 2010 à 17:00
3 mars 2010 à 17:00
Et justement : comment choisir l'application à qui envoyer la touche si on veux que ça soit l'application au premier plan, le bureau etc ? J'ai essayé :
void MainWindow::performGlobalShortcutA()
{
QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QApplication::sendEvent(QApplication::desktop() , &event);
qDebug() << "test" ;
}
Mais rien de plus...
void MainWindow::performGlobalShortcutA()
{
QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QApplication::sendEvent(QApplication::desktop() , &event);
qDebug() << "test" ;
}
Mais rien de plus...
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
7 mars 2010 à 11:50
7 mars 2010 à 11:50
Je ne comprend pas comment fonctionne D-Bus. Pourriez vous m'expliquer SVP ? Ca fonctionne seulement pour linux ou j'ai mal compris ?
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
23 févr. 2010 à 17:43
23 févr. 2010 à 17:43
J'ai essayé de faire ce que tu disait mais j'ai une erreur :
mainwindow.cpp:26: error: variable ‘QKeyEvent event’ has initializer but incomplete type
mainwindow.cpp:26: error: incomplete type ‘QEvent’ used in nested name specifier
mainwindow.cpp:27: error: incomplete type ‘QApplication’ used in nested name specifier
Où est l'erreur ?
mainwindow.cpp:26: error: variable ‘QKeyEvent event’ has initializer but incomplete type
mainwindow.cpp:26: error: incomplete type ‘QEvent’ used in nested name specifier
mainwindow.cpp:27: error: incomplete type ‘QApplication’ used in nested name specifier
Où est l'erreur ?
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
23 févr. 2010 à 20:55
23 févr. 2010 à 20:55
J'ai extrait ces deux lignes d'un de mes programmes. Le récepteur 'this' n'est qu'un exemple, il faut adapter selon le récepteur désiré.
L'exemple donné dans la doc de Qt est:
L'exemple donné dans la doc de Qt est:
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0); QApplication::sendEvent(mainWindow, &event);Bonne réflexion.
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
24 févr. 2010 à 16:36
24 févr. 2010 à 16:36
Je ne comprend pas... J'ai essayé plusieurs types de code est toujours cette erreur...
voici mon code :
// main.cpp
#include "MaFenetre.h"
#include <Qxt/QxtGui/QxtApplication>
#include <QWidget>
int main(int argc, char *argv[])
{
QxtApplication a(argc, argv);
MaFenetre w;
w.show();
return a.exec();
}
+++++++++
//MaFenetre.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QtGui/QMainWindow>
#include <QPushButton>
#include <QDebug>
#include <QApplication>
#include <QKeyEvent>
#include <Qxt/QxtGui/QxtGlobalShortcut>
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
~MaFenetre();
private:
QxtGlobalShortcut * shortcutA;
private slots:
void performGlobalShortcutA();
};
#endif // MAINWINDOW_H
+++++++++
//MaFenetre.cpp
#include "mainwindow.h"
#include <iostream>
#include <QCursor>
using namespace std;
MainWindow::MainWindow() : QWidget ()
{
QPushButton * btn = new QPushButton("close",this);
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(close()));
shortcutA= new QxtGlobalShortcut(this);
shortcutA->setShortcut(QKeySequence("F1"));
QObject::connect(shortcutA, SIGNAL(activated()), this, SLOT(performGlobalShortcutA()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::performGlobalShortcutA()
{
// qDebug() << "a";
//QCursor::setPos(0, 0);
QWidget * wf = QApplication::focusWidget();
QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(wf, &event);
}
Et l'erreur :
mainwindow.cpp: In member function ‘void MainWindow::performGlobalShortcutA()’:
mainwindow.cpp:26: error: incomplete type ‘QApplication’ used in nested name specifier
mainwindow.cpp:28: error: variable ‘QKeyEvent event’ has initializer but incomplete type
mainwindow.cpp:28: error: incomplete type ‘QEvent’ used in nested name specifier
mainwindow.cpp:29: error: incomplete type ‘QApplication’ used in nested name specifier
Voyez vous pourquoi mon code plante ??? Je n'y comprend plus rien...
Merci d'avance
voici mon code :
// main.cpp
#include "MaFenetre.h"
#include <Qxt/QxtGui/QxtApplication>
#include <QWidget>
int main(int argc, char *argv[])
{
QxtApplication a(argc, argv);
MaFenetre w;
w.show();
return a.exec();
}
+++++++++
//MaFenetre.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QtGui/QMainWindow>
#include <QPushButton>
#include <QDebug>
#include <QApplication>
#include <QKeyEvent>
#include <Qxt/QxtGui/QxtGlobalShortcut>
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
~MaFenetre();
private:
QxtGlobalShortcut * shortcutA;
private slots:
void performGlobalShortcutA();
};
#endif // MAINWINDOW_H
+++++++++
//MaFenetre.cpp
#include "mainwindow.h"
#include <iostream>
#include <QCursor>
using namespace std;
MainWindow::MainWindow() : QWidget ()
{
QPushButton * btn = new QPushButton("close",this);
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(close()));
shortcutA= new QxtGlobalShortcut(this);
shortcutA->setShortcut(QKeySequence("F1"));
QObject::connect(shortcutA, SIGNAL(activated()), this, SLOT(performGlobalShortcutA()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::performGlobalShortcutA()
{
// qDebug() << "a";
//QCursor::setPos(0, 0);
QWidget * wf = QApplication::focusWidget();
QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(wf, &event);
}
Et l'erreur :
mainwindow.cpp: In member function ‘void MainWindow::performGlobalShortcutA()’:
mainwindow.cpp:26: error: incomplete type ‘QApplication’ used in nested name specifier
mainwindow.cpp:28: error: variable ‘QKeyEvent event’ has initializer but incomplete type
mainwindow.cpp:28: error: incomplete type ‘QEvent’ used in nested name specifier
mainwindow.cpp:29: error: incomplete type ‘QApplication’ used in nested name specifier
Voyez vous pourquoi mon code plante ??? Je n'y comprend plus rien...
Merci d'avance
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
24 févr. 2010 à 16:48
24 févr. 2010 à 16:48
normalement, dans QWidget il y a des fonctions qu'il suffit de surcharger pour traiter les évènements du clavier.
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
24 févr. 2010 à 17:56
24 févr. 2010 à 17:56
Je suis allé voir dans QWidget et j'ai trouvé quelques méthodes relatives au clavier mais je les comprend pas... Elles ne prennent aucun paramètre, et ne renvoie rien. A quoi servent elles ? http://doc.trolltech.com/4.3/qwidget.html#grabKeyboard http://doc.trolltech.com/4.3/qwidget.html#releaseKeyboard
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
25 févr. 2010 à 08:20
25 févr. 2010 à 08:20
Je pensais plutôt à ça : http://doc.trolltech.com/4.3/qwidget.html#keyPressEvent
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
3 mars 2010 à 15:42
3 mars 2010 à 15:42
Non, ca ne fonctionne pas. Cette fonction sert juste à vérifier si l'utilisateur à appuyé sur une touche, et si oui laquelle, mais on ne peux pas simuler l'appuie de touche...
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 mars 2010 à 15:50
3 mars 2010 à 15:50
Oui, j'ai pris le problème à l'envers.
La solution de loupious me semble bonne. Les erreurs ressemblent à des erreurs d'inclusion.
As tu bien mis <QKeyEvent> dans les fichiers correspondant ?
La solution de loupious me semble bonne. Les erreurs ressemblent à des erreurs d'inclusion.
As tu bien mis <QKeyEvent> dans les fichiers correspondant ?
little_programmeur
Messages postés
54
Date d'inscription
mercredi 28 janvier 2009
Statut
Membre
Dernière intervention
27 juin 2019
4
3 mars 2010 à 16:38
3 mars 2010 à 16:38
Pour l'erreur decompilation, c'était bien un problème d'inclusion, mais après avoir compilé, le programme ne fonctionne pas. Lorsque j'appuie sur a (la touche qui doit servir de "signal") la touche tab n'est pas simulée. Est-ce parceque la simulation n'est valable que pour la fenêtre actuelle ou est-ce un problème de Qt, de mon programme ou est-ce car je suis sous linux ?
Voila mon .cpp :
#include "mainwindow.h"
#include <iostream>
#include <QCursor>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QPushButton * btn = new QPushButton("close",this);
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(close()));
shortcutA= new QxtGlobalShortcut(this);
shortcutA->setShortcut(QKeySequence("a"));
QObject::connect(shortcutA, SIGNAL(activated()), this, SLOT(performGlobalShortcutA()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::performGlobalShortcutA()
{
QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(this, &event);
qDebug() << "test" ;
}
J'utilise Qxt pour les raccourcis.
Voila mon .cpp :
#include "mainwindow.h"
#include <iostream>
#include <QCursor>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QPushButton * btn = new QPushButton("close",this);
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(close()));
shortcutA= new QxtGlobalShortcut(this);
shortcutA->setShortcut(QKeySequence("a"));
QObject::connect(shortcutA, SIGNAL(activated()), this, SLOT(performGlobalShortcutA()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::performGlobalShortcutA()
{
QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(this, &event);
qDebug() << "test" ;
}
J'utilise Qxt pour les raccourcis.