2010-08-10 3 views
3

petite application de jouet se trouve ici: http://gist.github.com/517445travail Qt artificielle clics de souris ne marche pas correctement

Je suis en train d'envoyer un événement de souris artificielle widget et j'utilise QApplication :: sendEvent pour que, à côté je vérifie ev.isAccepted() et retourne False, encore pire! Widget J'ai envoyé un événement à ne pas le gérer (il s'agit d'un calendrier étendu et aucune date n'est sélectionnée) et je doute qu'il le reçoive, car je peux voir comment mouseEventPressed est activé sur le widget parent.

Qt code:

#include "calendar.h" 

Calendar::Calendar(QWidget *parent) : 
    QWidget(parent) 
{ 
    qCal = new QCalendarWidget; 
    qBtn = new QPushButton(tr("Press me")); 

    connect(qBtn, SIGNAL(clicked()), this, SLOT(testCustomClick())); 

    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(qCal); 
    layout->addWidget(qBtn); 

    setLayout(layout); 
    qDebug() << "Date:" << QDate::currentDate(); 
} 

Calendar::~Calendar() 
{ 
} 

void Calendar::testCustomClick() 
{ 
    QMouseEvent qm2(QEvent::MouseButtonPress, QPoint(qCal->width()/2, 
     qCal->height()/2), Qt::LeftButton , Qt::LeftButton, Qt::NoModifier); 
    QApplication::sendEvent(qCal, &qm2); 

    //this one is always False 
    qDebug() << "isAccepted: " << qm2.isAccepted(); 
} 


void Calendar::mousePressEvent(QMouseEvent* ev) 
{ 
    //this is executed even for QMouseEvent which sended to qCal =((
    //if we click on qCal with real mouse it is not executed 
    qDebug() << "mouse event: " << ev << "x=" << ev->x() <<" y=" << ev->y(); 
    QWidget::mousePressEvent(ev); 
} 

Selon le code source QApplication :: sendEvent appelle widget-> événement() qui pour QCalendarWidget est fini dans QAbstractScrollArea qui retourne false pour chaque souris connexes un événement.

Si j'ai raison, comment puis-je émuler les clics et les pressions de la souris?

Répondre

4

La solution est d'envoyer un événement au widget exact sous le curseur, pas à ses parents.

void Calendar::testCustomClick() 
{ 
    QPoint pos(qCal->width()/2,qCal->height()/2); 
    QWidget *w = qApp->widgetAt(qCal->mapToGlobal(pos)); 
    qDebug() << "widget under point of click: " << w; 

    { 
    QMouseEvent qm2(QEvent::MouseButtonPress, pos, Qt::LeftButton , Qt::LeftButton, Qt::NoModifier); 
    QApplication::sendEvent(w, &qm2); 
    } 
    { 
    QMouseEvent qm2(QEvent::MouseButtonRelease, pos, Qt::LeftButton , Qt::LeftButton, Qt::NoModifier); 
    QApplication::sendEvent(w, &qm2); 
    } 

}

+1

quel problème voulez-vous résoudre? Je ne peux pas penser à autant de cas où il faut émuler les clics de souris. Sauf peut-être pour les boutons de déclenchement, mais ils ont un clic(). –

+3

J'intègre l'application Qt en tant que texture dans un moteur 3D. J'aimerais que les utilisateurs puissent cliquer sur la texture et interagir avec l'application. – redbaron

Questions connexes