Мне надо в фукции расположить курсор мыши сначала в точке с координатами (0,0) а потом в точке (width()-1, height()-1). Делаю так:
QMouseEvent me0(QEvent::MouseMove, QPoint(0, 0), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWidget::mouseMoveEvent(&me0);
// дальнейште действия
QMouseEvent me1(QEvent::MouseMove, QPoint(width()-1, height()-1), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWidget::mouseMoveEvent(&me1);
// дальнейшие действия
qApp->processEvents()
вставить? Но куда?
смотри доки на функции
bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]
void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]
тебе нужна 1-ая
Результат тот же.
Если поставить qApp->processEvents() после второго sendEvent то отрабатывают два события мыши, но у второго какие-то странные координаты - посередине виджета
Что то я сразу не догадался, проще будет воспользоваться функцией
void QCursor::setPos ( int x, int y ) [static]
она должна так ка надо отработать
Спасибо, но мне надо чтобы два раза в системе отработало событие перемещения мыши,а после вызова QCursor::setPos оно не отрабатывает (ну или мой виджет их не получает)
Ну вот смотри - элементарный тестовый пример
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton *button = new QPushButton("move cursor",this);
widget = new QWidget(this);
widget->setMinimumSize(250,250);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(widget);;
layout->addWidget(button);
widget->installEventFilter(this);
widget->setMouseTracking(true);
connect(button, SIGNAL(clicked()), this, SLOT(moveCursor()));
}
bool Widget::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::MouseMove) {
QMouseEvent *mouse = static_cast<QMouseEvent*>(e);
qDebug() << mouse << mouse->pos();
}
return false;
}
void Widget::moveCursor()
{
QCursor::setPos (widget->mapToGlobal(QPoint(10,10)));
QCursor::setPos (widget->mapToGlobal(QPoint(150,150)));
}
Я работаю с google maps API в классе, унаследованном от QWebView. То есть у меня отображается html-страница. В тексте этой html-страницы есть код:
google.maps.event.addListener(map, 'mousemove', function(event) {
var coordinates = event.latLng;
cMap.onGeo(coordinates.lat(), coordinates.lng());
});
QMouseEvent me0(QEvent::MouseMove, QPoint(0, 0), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWebView::mouseMoveEvent(&me0);
QMouseEvent me1(QEvent::MouseMove, QPoint(width()-1, height()-1), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWebView::mouseMoveEvent(&me1);
QCursor::setPos(mapToGlobal(QPoint(0, 0)));
QCursor::setPos(mapToGlobal(QPoint(width()-1, height()-1)));
- то вообще ни разу... Подскажите как добиться чтобы onGeo вызывалось 2 раза
Мне кажется вы лукавите, если это реальный код, то второй вызов mouseMoveEvent() должен произойти, если приложение не крашится или не зацикливается, иначе это противоречит вообще программной логике.
QMouseEvent me0(QEvent::MouseMove, QPoint(0, 0), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWebView::mouseMoveEvent(&me0);
QMouseEvent me1(QEvent::MouseMove, QPoint(width()-1, height()-1), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QWebView::mouseMoveEvent(&me1);
Это точно реальный код
void foo()
{
bar();
bar();
}
mouseMoveEvent вызывается 2 раза как и должно.
Я говорю что onGeo() вызывается 1 раз, и происходит это скорее всего потому что при последовательном выполении операторов на определенное время блокируется принятие событий. (пример - for(int i=0; i<100000; i++){какие-то длительные действия} - программа подвиснет, если это сделать в основном потоке)
Короче надо каким-то образом доставить накопившиеся события (в данном случае событие движения мыши)...
qApp->processEvents()
QMouseEvent me0(QEvent::MouseMove, QPoint(), 0, 0, 0);
QMouseEvent me1(QEvent::MouseMove, QPoint(width()-1, height()-1), 0, 0, 0);
QCoreApplication::sendEvent(this, &me0);
// do stuff
QCoreApplication::sendEvent(this, &me1);
// do stuff
А почему processEvents в данном случае не поможет? Этих событий в главном цикле нет?...А вон оно что, не уделил внимания строке QWebView::mouseMoveEvent(&me0).
SABROG, без qApp->processEvents() действительно не работает. Причин не выяснял. Может быть есть какая то оптимизация доставляемых событий в контекст JavaScript? Не знаю в общем, могу только догадываться.
mezmay, в приложение рабочий пример для второй версии API карт гугл. В общем там ничего нового, всё то что уже здесь обсудили, но у меня этот код обрабатывает так как задумано. В общем, попробуй
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)