• 10067阅读
  • 6回复

qt中的mouseMoveEvent? [复制链接]

上一主题 下一主题
离线djking1986
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-22
我用的是qt4.4.3,想实现鼠标移动显示QWidget,但是用mouseMoveEvent必须先点击拖动才能显示,文档中说只要setMouseTracking(true),就可以不点击就可以显示,但是我并不能实现。网上查了下,好多人说跟qt版本有关。我不知道是什么原因。
大家能否给个可以实现不用点击显示的方案?
focus speed
离线djking1986
只看该作者 1楼 发表于: 2009-10-23
自己给自己顶顶,问题已经解决了 确实是捕获不到鼠标移动 但是不是setMouseTracking(true)没有效果,而是另外一个原因导致的(无法描述)
focus speed
离线leaves
只看该作者 2楼 发表于: 2009-10-25
无法描述 ?是什么意思,
离线djking1986
只看该作者 3楼 发表于: 2009-10-26
呵呵 就是引起该问题的原因有点不好描述 所以本人就无可奉告了
focus speed
离线午小夜

只看该作者 4楼 发表于: 2009-10-26
我以前寫測試程序的時候遇到過這樣的問題。我跟你講下我的情況,希望對你有幫助:

我的測試程序目的是要這樣的,在一個QWidget中,放置了一個QPushButton(非常大),然後在mouseMoveEvent中定義了一個矩形塊,當鼠標移動到矩形塊内部時就變換鼠標樣式,然後使用QWidget::setMouseTracking(true)。結果是,要一直按住鼠標右鍵拖動,才響應mouseMoveEvent裏邊的語句。
最後,發現一個問題,我定義的那個矩形塊是QPushButton的勢力範圍(即這個矩形塊的最頂端的是QPushButton),使用QPushButton::setMouseTracking(true) 之後,便可正常響應了。所以我覺得,因爲QPushButton是最頂端的物體,所以,mouseMoveEvent事件被QPushButton截獲了。

  1. Widget::Widget(QWidget *parent)
  2.     : QWidget(parent)
  3. {
  4. //    this->setMouseTracking(true);
  5.     qDebug()<<this->hasMouseTracking();
  6.     timer = new QTimer(this);
  7.     timer->start(10000);
  8.     connect(timer,SIGNAL(timeout()),this,SLOT(flashSlot()));
  9.     btn = new QPushButton(this);
  10.     btn->setFixedSize(QPixmap("./1.jpg").size());
  11.     setStyleSheet("QPushButton{margin:5px;border:10px solid silver;padding:5px;"
  12.                        "background-color:gray;"
  13.                        "background-image:url(./1.jpg);"
  14.                        "background-position:top left;"
  15.                        "background-origin:content;"
  16.                        "background-repeat:none;}"
  17.                        "QPushButton:pressed {"
  18.                         "background-color: green;"
  19.                     "}");
  20.     btn->setMouseTracking(true);
  21.     btn->show();
  22. }
  23. void Widget::mouseMoveEvent(QMouseEvent *e)
  24. {
  25.     QRect rect(0,0,300,100);
  26.     QRect rect1(0,100,300,100);
  27.     QRect rect2(0,200,300,100);
  28.     if(rect.contains(e->pos()))
  29.     {
  30.         this->setCursor(Qt::OpenHandCursor);
  31.     }
  32.     else if(rect1.contains(e->pos()))
  33.     {
  34.         this->setCursor(Qt::ClosedHandCursor);
  35.     }
  36.     else if(rect2.contains(e->pos()))
  37.     {
  38.         this->setCursor(Qt::PointingHandCursor);
  39.     }
  40.     else
  41.     {
  42.         this->setCursor(Qt::ArrowCursor);
  43.     }
  44. }
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线belle
只看该作者 5楼 发表于: 2009-10-27
谢谢午小夜的帖子
离线djking1986
只看该作者 6楼 发表于: 2009-10-28
我也同意小午夜的观点。我是用QStackedLayout的时候出的错,估计也是被QStackedLayout给截获了
focus speed
快速回复
限100 字节
 
上一个 下一个