Маленькое игрушечное приложение можно найти здесь: 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 для каждой мыши связанное событие.
Если я прав, то как мне эмулировать щелчки мыши и нажатия клавиш?