• 4706阅读
  • 3回复

Mouse 移動離開原視窗後,仍可取得Mouse 螢幕座標? [复制链接]

上一主题 下一主题
离线ming0630
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-01
請教各位大大,如何將目前螢幕滑鼠移動的座標位置(X,Y) 即時顯示在自己所建立新Form 上的Label 上?
在書裡所寫的都是只針對自己所建立的Form 內的物件重寫相關Event(如下),但是只要滑鼠移出了this Form 就沒有作用了,
能否請各位大大指導一下,感恩不盡~~~

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
class EventLabel : public QLabel
{
   protected:
   void mouseMoveEvent(QMouseEvent *event);
   void mousePressEvent(QMouseEvent *event);
   void mouseReleaseEvent(QMouseEvent *event);
};
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
   QString msg;
   msg.sprintf("<center><h1>Move: (%d, %d)</h1></center>", event->globalX(), event->globalY());
   this->setText(msg);
}
void EventLabel::mousePressEvent(QMouseEvent *event)
{
   QString msg;
   msg.sprintf("<center><h1>Press: (%d, %d)</h1></center>", event->globalX(), event->globalY());
   this->setText(msg);
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
   QString msg;
   msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->globalX(), event->globalY());
   this->setText(msg);
}
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   EventLabel *label = new EventLabel;
   label->setWindowTitle("MouseEvent Demo");
   label->resize(300, 200);
   label->show();
   return app.exec();
}
离线sdh-bing
只看该作者 1楼 发表于: 2009-10-01
关注
离线ming0630
只看该作者 2楼 发表于: 2009-10-01
我有找到解決的方法了,
在mouseMoveEvent 事件裡加入grabMouse(),
而且在mousePressEvent 及mouseReleaseEvent 一定要加入releaseMouse(),否則mouse 將被該程式強制剝奪,而無法做其他事,在QT Reference 也有提到:

Warning: Bugs in mouse-grabbing applications very often lock the terminal. Use this function with extreme caution, and consider using the -nograb command line option while debugging

要小心慎用,不知道還有沒有人有更好的方法可以提供呢?
离线318065268
只看该作者 3楼 发表于: 2009-10-05
最好的办法还是直接调用系统的驱动读取鼠标当前的位置信息。其它的都是大费周章。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
快速回复
限100 字节
 
上一个 下一个