Как использовать QCoreApplication :: postEvent для вставки событий синтетического ввода - PullRequest
6 голосов
/ 04 января 2012

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

edit

Я сейчас используюследующее, которое отлично работает (Большое спасибо Дасти Кэмпбелл ):

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);
}

Ответы [ 2 ]

9 голосов
/ 05 января 2012

Можете ли вы использовать 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()).

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

3 голосов
/ 05 января 2012

Я бы предложил опубликовать некоторый код в соответствии с документацией подпись:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...