Когда я отправляю или публикую QMouseEvent, в позиции QPushbutton, его сигнал clicked () не излучается - PullRequest
2 голосов
/ 16 мая 2011

Я пытаюсь создать графический интерфейс для приложения дополненной реальности, используя kinect.Идея состоит в том, чтобы использовать руки, обнаруженные при отслеживании скелета Kinect, для управления приложением с помощью жестов.

Этот вопрос не о жестах, так как эта часть моего приложения работает нормально.

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

В QWebView все работает отлично.В окне браузера я могу «кликнуть» по ссылкам.

Но по какой-то причине я не могу "нажать" на QPushButton.Сигнал clicked () не излучается.У меня есть короткий пример для иллюстрации моей проблемы:

Сначала основная функция:

int main(int argc, char **argv){
    QApplication app( argc, argv );
    QWebViewButtons mainapp( 0, Qt::Window );
    app.setActiveWindow( &mainapp );
    mainapp.show();
    mainapp.setApplication( &app ); //this is a setter to also get access to the main application in the widget
    return app.exec();
}

Это мой собственный виджет:

QWebViewButtons::QWebViewButtons(QWidget* parent, Qt::WindowFlags flags ): QWidget(parent, flags ){
    this->m_ui.setupUi( this );
    QObject::connect( this->m_ui.pushButton, SIGNAL(clicked(bool)), this, SLOT( buttonClicked(bool) ) );
}

void QWebViewButtons::mousePressEvent( QMouseEvent* event ){
    printf("mouse click, %d, %d\n", event->pos().x(), event->pos().y() );
}

void QWebViewButtons::buttonClicked( bool clicked ){
    printf("slot button clicked\n");    
}

void QWebViewButtons::keyPressEvent( QKeyEvent* event ){
    printf("Key pressed\n"); 
    QPoint pos( this->width()/2, this->height()/2 );
    QPoint global = this->mapToGlobal(pos);
    QWidget *w = this->m_app->widgetAt(global);
    //printf("widget under point of click: %s", w);
    QApplication::sendEvent( w, new QMouseEvent( QEvent::MouseButtonPress, pos, Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier ) );
    QApplication::sendEvent( w, new QMouseEvent( QEvent::MouseButtonRelease, pos, Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier ) );
}

Я последовал предложению здесь: Qt Искусственные щелчки мыши не работают должным образом и отправлять, чтобы отправить события моей мыши непосредственно в QPushButton.Но это не помогло.Я также пытался отправить события мыши в «this» или в главное приложение.

Теперь у меня заканчиваются идеи.Я хочу, чтобы слот buttonClicked () вызывался, если я нажимаю любую клавишу.Но я только звоню, если я нажимаю кнопку с моей мышью.Как я могу сделать это?Или моя основная идея полностью ложна?

Спасибо за ваши идеи.

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Итак, я правильно понял? Делая свой "щелчок-жест", вы заходите в keyPressEvent? Если это так, вы можете проверить, было ли выполнено «нажатие» над кнопкой, и явно вызвать сигнал кнопки clicked (). Но это не то, что вы хотите?

А что именно QWebViewButtons? Область, в которой пользователь делает свои жесты?

Вы отладили в keyPressEvent, чтобы увидеть, есть ли у вашего sendEvent правильный виджет (w)? Я не понимаю, почему виджет не должен получать событие ...

И помните, что при создании нового QMouseEvent и его отправке через sendEvent оно никогда не удаляется. При использовании sendEvent вы должны создать свое событие в стеке.

Возможно, вам следует взглянуть на эту ветку, где рекомендуется QTestEventList: Подражание / фальсификация щелчка мыши и колеса мыши с использованием Qt . Но я могу представить, что вам не нужны тестовые функции;)

0 голосов
/ 20 мая 2011

Хорошо, уловка была в том, чтобы действительно послать клик виджету EXACT в желаемой позиции клика.В моем приложении у меня были некоторые проблемы из-за полупрозрачных виджетов, лежащих друг над другом.

Так что команда widgetAt (global) мне не помогла.Но вы можете использовать childAt (global) вместо этого.Конечно, вам нужно знать, из какого виджета вы хотите найти ребенка.

Это помогло мне.: -)

...