crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в как инициировать mouseMoveEvent
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
igor_bogomolov Дата 14.12.2010, 23:54
  SABROG, без qApp->processEvents() действительно не работает. Причин не выяснял. Может быть есть какая то оптимизация доставляемых событий в контекст JavaScript? Не знаю в общем, могу только догадываться.

mezmay, в приложение рабочий пример для второй версии API карт гугл. В общем там ничего нового, всё то что уже здесь обсудили, но у меня этот код обрабатывает так как задумано. В общем, попробуй
Rocky Дата 14.12.2010, 22:19
  А почему processEvents в данном случае не поможет? Этих событий в главном цикле нет?...А вон оно что, не уделил внимания строке QWebView::mouseMoveEvent(&me0).
SABROG Дата 14.12.2010, 19:00
 
Цитата(Rocky @ 14.12.2010, 15:37) *
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


Только убедись, чтобы это было не в конструкторе виджета главного окна и до вызова этих строк был запущен основной цикл событий.
Rocky Дата 14.12.2010, 15:37
  qApp->processEvents()
mezmay Дата 14.12.2010, 15:04
  mouseMoveEvent вызывается 2 раза как и должно.
Я говорю что onGeo() вызывается 1 раз, и происходит это скорее всего потому что при последовательном выполении операторов на определенное время блокируется принятие событий. (пример - for(int i=0; i<100000; i++){какие-то длительные действия} - программа подвиснет, если это сделать в основном потоке)
Короче надо каким-то образом доставить накопившиеся события (в данном случае событие движения мыши)...
SABROG Дата 14.12.2010, 11:16
 
Цитата(mezmay @ 14.12.2010, 9:24) *
Это точно реальный код

Тогда объясните мне поведение такого метода:

void foo()
{
    bar();
    bar();
}


Вы говорите, что bar() вызывается только 1 раз. Значит выхода из foo() - не будет! А если его не будет, значит программа будет уже работать некорректно.
mezmay Дата 14.12.2010, 9:24
  Это точно реальный код
SABROG Дата 10.12.2010, 17:23
  Мне кажется вы лукавите, если это реальный код, то второй вызов 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);
mezmay Дата 10.12.2010, 15:46
  Я работаю с google maps API в классе, унаследованном от QWebView. То есть у меня отображается html-страница. В тексте этой html-страницы есть код:

google.maps.event.addListener(map, 'mousemove', function(event) {
        var coordinates = event.latLng;
        cMap.onGeo(coordinates.lat(), coordinates.lng());
  });

- это значит что при возникновении события движения мыши из JavaScript вызывается С++ слот моего класса onGeo().

Когда в своем классе я пишу:
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);

- в этом случае onGeo() вызывается 1 раз (хотя по идее должно 2 раза).
А если написать:
    QCursor::setPos(mapToGlobal(QPoint(0, 0)));

    QCursor::setPos(mapToGlobal(QPoint(width()-1, height()-1)));
- то вообще ни разу... Подскажите как добиться чтобы onGeo вызывалось 2 раза
igor_bogomolov Дата 10.12.2010, 14:38
  Ну вот смотри - элементарный тестовый пример
Раскрывающийся текст
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)));
}


Вывод (координаты в шестнадцатиричном виде):
Цитата
QMouseEvent(MouseMove, 0, 0, 0) QPoint(a,a)
QMouseEvent(MouseMove, 0, 0, 0) QPoint(96,96)
Т.е. всё работает так как надо
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 13:52