• 7242阅读
  • 0回复

[QT4.7]请教:关于键盘模拟点击的一个问题 [复制链接]

上一主题 下一主题
离线大笨虎
 
只看楼主 倒序阅读 楼主  发表于: 2010-11-09
— 本帖被 XChinux 执行加亮操作(2010-11-10) —
“本想贴图的,但是发现图片连接不能用”

图片为一个很平常见的浏览器,分为蓝色框和红色框

图片中蓝色框为标签、工具、功能部分,红色框为浏览器页面显示部分
实现代码为eventfilter,如下:
#define CURSOR_SP1 7
#define CURSOR_SP2 15
#define TIMEDELAY -500


bool BrowserApplication::eventFilter(QObject *obj,QEvent *event)
{
  QPoint pos;
  QPoint mPoint;
  QPoint mGPoint;
  QMouseEvent *mevent;
  QKeyEvent *qevent;

  static QTime oldTime = QTime::currentTime();
  QTime curTime = QTime::currentTime();
  int timeMis = curTime.msecsTo(oldTime);

  static bool numLockFlag = true;
  static QPoint posMis;

  // 1 for up, 2 for down, 3 for left, 4 for right
  static int keyFlag = 1;
  static int flagCount = 0;

  int cursorSP = 1;

  if((QEvent::KeyRelease == event->type()) || (QEvent::KeyPress == event->type())) {
  qevent = static_cast<QKeyEvent *>(event);
  if ( qevent->key() == Qt::Key_NumLock && QEvent::KeyPress == event->type() ) {
  numLockFlag = !numLockFlag;
  return true;
  }
  switch(qevent->key()) {
  case Qt::Key_Up:
  if ( !numLockFlag )
  break;
  if ( keyFlag == 1 && timeMis > TIMEDELAY )
  flagCount++;
  else
  flagCount = 0;
  if ( flagCount >= 10 && flagCount < 20 )
  cursorSP = CURSOR_SP1;
  else if ( flagCount >= 20 )
  cursorSP = CURSOR_SP2;
  pos = QCursor::pos();
  pos.setY(pos.y() - cursorSP);
  QCursor::setPos(pos);
  oldTime = QTime::currentTime();
  keyFlag = 1;
  return true;

  ... ...

  case Qt::Key_Enter:
pos = QCursor::pos();
pos.setX(pos.x() - posMis.x());
pos.setY(pos.y() - posMis.y());
printf("$$$Areos: KEY_P&R X = %d, Y = %d \n", pos.x(), pos.y());
QMouseEvent *mEvnPress;
QMouseEvent *mEvnRelease;
mEvnPress = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
mEvnRelease = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCoreApplication::postEvent(obj, mEvnPress);
QCoreApplication::postEvent(obj, mEvnRelease);
return true;

  default:
  printf("$$$jervis:default:%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
  break;
  }
  } else if ((event->type() == QEvent::MouseMove) || (event->type() == QEvent::MouseButtonPress) || (event->type() == QEvent::MouseButtonRelease)) {
  mevent = static_cast<QMouseEvent *>(event);
  mGPoint = mevent->globalPos();
  mPoint = mevent->pos();
  printf("###Areos: mouse_M X = %d, Y = %d \n", mPoint.x(), mPoint.y());
  printf("###Areos: mouse_M GX = %d, GY = %d \n", mGPoint.x(), mGPoint.y());
  if( posMis != (mGPoint - mPoint) )
  posMis = mGPoint - mPoint;
  }
  return false;
}


问题
现在在红色区域已经可以实现键盘按键enter模拟鼠标点击,但是在蓝色框部分不能实现,问题应该是出在
mEvnPress = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCoreApplication::postEvent(obj, mEvnPress);
这个地方,pos给的是global坐标(对于红色区域使用的时候,已经将局部与全局偏差修正过,),但是对于蓝色区域,通过上面鼠标移动事件,检测发现其相对坐标分为三块:标签栏一块,上面英文功能栏一块,中间地址栏一块
现在我想让蓝色部分也实现能让enter键“点击”
大家帮忙讨论下,看看会是哪里出的问题
快速回复
限100 字节
 
上一个 下一个