crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> как инициировать mouseMoveEvent
mezmay
  опции профиля:
сообщение 10.12.2010, 11:19
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Мне надо в фукции расположить курсор мыши сначала в точке с координатами (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()
вставить? Но куда?

Сообщение отредактировал mezmay - 10.12.2010, 11:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.12.2010, 12:06
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


смотри доки на функции
bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]
void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]
тебе нужна 1-ая
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 10.12.2010, 13:04
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Результат тот же.
Если поставить qApp->processEvents() после второго sendEvent то отрабатывают два события мыши, но у второго какие-то странные координаты - посередине виджета
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.12.2010, 13:36
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Что то я сразу не догадался, проще будет воспользоваться функцией
void QCursor::setPos ( int x, int y ) [static]
она должна так ка надо отработать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 10.12.2010, 13:58
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Спасибо, но мне надо чтобы два раза в системе отработало событие перемещения мыши,а после вызова QCursor::setPos оно не отрабатывает (ну или мой виджет их не получает)

Сообщение отредактировал mezmay - 10.12.2010, 14:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.12.2010, 14:38
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Ну вот смотри - элементарный тестовый пример
Раскрывающийся текст
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)
Т.е. всё работает так как надо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 10.12.2010, 15:46
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Я работаю с 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 раза

Сообщение отредактировал mezmay - 10.12.2010, 15:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 10.12.2010, 17:23
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Мне кажется вы лукавите, если это реальный код, то второй вызов 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
  опции профиля:
сообщение 14.12.2010, 9:24
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Это точно реальный код
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.12.2010, 11:16
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(mezmay @ 14.12.2010, 9:24) *
Это точно реальный код

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

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


Вы говорите, что bar() вызывается только 1 раз. Значит выхода из foo() - не будет! А если его не будет, значит программа будет уже работать некорректно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 17:52