您的位置:首页 > 编程语言 > Qt开发

QT 模拟鼠标事件

2014-05-28 14:50 288 查看
模拟鼠标按键

和模拟键盘按键类似,也是通过发送相应的事件来实现的,安装相应的事件监听器,具体发送事件:

QPoint pos;

pos.setX(0);

pos.setY(0);

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中的定位,以及具体的按键是什么。

[cpp] view
plaincopy

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: