2012-01-04 3 views
5

Я вставляю события клавиатуры и мыши, которые передаются по сети в мое приложение Qt и используют для этого QCoreApplication::postEvent. Координаты мыши - это абсолютные координаты пикселя экрана.Как использовать QCoreApplication :: postEvent для ввода синтетических событий ввода

QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons, 
    Qt::NoModifier); 
QCoreApplication::postEvent(g_qtdraw.main.widget, event); 

Изначально у меня был только один виджет (на который ссылается g_qtdraw.main.widget), так что я просто использовал, что один в качестве аргумента приемника для postEvent. Теперь мое приложение имеет более одного виджета, и приведенный выше код больше не делает то, что я хочу.

Второй виджет отображается в полноэкранном режиме, и я знаю, что все события мыши должны идти в это окно, но с приведенным выше кодом они все еще маршрутизируются на главный виджет.

Как выбрать правильный виджет в качестве приемника (тот, который находится под мышью x, y coords)? Есть ли стандартный способ, так что Qt выбирает правильный виджет или мне нужно его отслеживать?

редактировать

теперь я использую следующие, работает отлично (Большое спасибо Dusty Campbell):

QPoint pos(x, y); 
QWidget *receiver = QApplication::widgetAt(pos); 
if (receiver) { 
    QMouseEvent *event = new QMouseEvent(type, receiver->mapFromGlobal(pos), mouse_button, 
     mouse_buttons, Qt::NoModifier); 
    QCoreApplication::postEvent(receiver, event); 
} 

ответ

8

Вы можете использовать QApplication::widgetAt(), чтобы найти правильный виджет в положении, а затем пост по этому поводу?

QPoint pos(x, y); 
QMouseEvent *event = new QMouseEvent(type, pos, mouse_button, mouse_buttons, Qt::NoModifier); 
QWidget *receiver = QApplication::widgetAt(pos); 
QCoreApplication::postEvent(receiver, event); 

Я бы не ожидал, что вам придется делать это для ключевых событий. Их следует отправить сосредоточенному виджету (QApplication::focusWidget()).

К сожалению, я не тестировал это.

+0

Спасибо, я получил его для работы, используя ваш намек. Я также должен был использовать receiver-> mapFromGlobal (pos), чтобы координаты были правильными. – trenki

3

Я предложил бы разместить код в соответствии с documentation подпись:

void QCoreApplication::postEvent (QObject * receiver, QEvent * event) [static] 

Имейте вы пытались дать указатель на соответствующий QObject как аргумент receiver?

(редактировать: отметить, что QWidget наследует QObject)

+0

Я добавил новую информацию. Когда у меня есть несколько окон/виджета, как выбрать правильный (тот, который находится под мышью x, y)? – trenki

+0

Ах, вы пропустили ключевую информацию о том, как вы хотели решить виджет;) –

Смежные вопросы