模拟鼠标按键
和模拟键盘按键类似,也是通过发送相应的事件来实现的,安装相应的事件监听器,具体发送事件:
QPoint pos;
pos.setX(88);
pos.setY(58);
QMouseEvent *mEvnPress;
QMouseEvent *mEvnRelease;
mEvnPress = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(QWidget::focusWidget(),mEvnPress);
mEvnRelease = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(QWidget::focusWidget(),mEvnRelease);
主要的分析函数是:
QMouseEvent::QMouseEvent ( Type type, const QPoint & position, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
参数分析:
The type parameter must be one of QEvent::MouseButtonPress, QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick, or QEvent::MouseMove.
The position is the mouse cursor's position relative to the receiving widget.
The button that caused the event is given as a value from the Qt::MouseButton enum. If the event type is MouseMove, the appropriate button for this event is Qt::NoButton.
The mouse and keyboard states at the time of the event are specified by buttons and modifiers.
The globalPos() is initialized to QCursor::pos(), which may not be appropriate. Use the other constructor to specify the global position explicitly.
主要说明:
这里的pos的位置是接受鼠标事件的widget的内部的一个局部位置。也就是说他的鼠标按键的产生点是:先通过
QApplication::sendEvent(QWidget::focusWidget(),mEvnPress);//也就是说先是指明了传递给哪个widget
然后再根据mEventPress来进行具体的再改widget中的定位,以及具体的按键是什么。
bool MainWidget::eventFilter(QObject *target, QEvent *event) { if(event->type()==QEvent::FocusIn){//event->type()==QEvent::Enter || static_cast<QPushButton*>(target)->setStyleSheet("background-color: rgb(129, 129,129)"); QPalette pal; pal.setColor(QPalette::Active,QPalette::ButtonText,Qt::red); static_cast<QPushButton*>(target)->setPalette(pal); } else if(event->type()==QEvent::FocusOut){//event->type()==QEvent::Leave || static_cast<QPushButton*>(target)->setStyleSheet(""); QPalette pal; pal.setColor(QPalette::Active,QPalette::ButtonText,Qt::black); static_cast<QPushButton*>(target)->setPalette(pal); } else if(event->type()== QEvent::KeyPress){ QPoint pos; QWidget *now_button= QWidget::focusWidget(); QKeyEvent *k = (QKeyEvent *)event; QLayoutItem *next_button; switch (k->key()){ case Qt::Key_Up: next_button= ui->gridLayout->itemAt((ui->gridLayout->indexOf(now_button)+8)%12); next_button->widget()->setFocus(); break; case Qt::Key_Down: next_button= ui->gridLayout->itemAt((ui->gridLayout->indexOf(now_button)+4)%12); next_button->widget()->setFocus(); #ifdef COURSE QCursor::setPos(pos); #endif break; case Qt::Key_Left: next_button= ui->gridLayout->itemAt((ui->gridLayout->indexOf(now_button)-1+12)%12); next_button->widget()->setFocus(); #ifdef COURSE QCursor::setPos(pos); #endif break; case Qt::Key_Right: next_button= ui->gridLayout->itemAt((ui->gridLayout->indexOf(now_button)+1)%12); next_button->widget()->setFocus(); break; case Qt::Key_Period: pos = now_button->pos(); pos.setX( 20 + pos.x()+(now_button->width())/2 ); pos.setY( 20 + pos.y()+(now_button->height())/2 ); //printf("/n***%d1 %d***/n",pos.x(),pos.y()); #ifdef COURSE QCursor::setPos(pos); #endif pos.setX(88); pos.setY(58); QMouseEvent *mEvnPress; QMouseEvent *mEvnRelease; mEvnPress = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(QWidget::focusWidget(),mEvnPress); mEvnRelease = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(QWidget::focusWidget(),mEvnRelease); next_button = ui->gridLayout->itemAt(ui->gridLayout->indexOf(QWidget::focusWidget())); break; default: return QWidget::eventFilter(target,event); } if(next_button){ pos.setX( 20 + next_button->geometry().x() + (next_button->geometry().width()) / 2 ); pos.setY( 20 + next_button->geometry().y() + (next_button->geometry().height()) / 2); #ifdef COURSE QCursor::setPos(pos); #endif } return true; } return QWidget::eventFilter(target,event); }