Qt Искусственные щелчки мыши не работают должным образом - PullRequest
3 голосов
/ 10 августа 2010

Маленькое игрушечное приложение можно найти здесь: http://gist.github.com/517445

Я пытаюсь отправить событие искусственной мыши в виджет, и я использую QApplication :: sendEvent для этого, затем я проверяю ev.isAccepted (), и он возвращает False, что еще хуже ! Виджет, который я отправил событию, не обрабатывает его (это календарь, и дата не выбрана), и я сомневаюсь, что оно даже получает его, потому что я могу видеть, как mouseEventPressed запускается в родительском виджете.

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);
}

Согласно исходному коду QApplication :: sendEvent вызывает widget-> event () , который для QCalendarWidget заканчивается в QAbstractScrollArea , который возвращает false для каждой мыши связанное событие.

Если я прав, то как мне эмулировать щелчки мыши и нажатия клавиш?

1 Ответ

4 голосов
/ 11 августа 2010

Решение - отправить событие точному виджету под курсором, а не его родителям.

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);
   }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...