[請教]如何抓取目前螢幕的滑鼠座標位置?

喜歡程式設計嗎?想要一窺 KDE/Qt 程式設計的奧秘嗎?想要
學習 X Window 上的視窗程式設計嗎?歡迎各類關於 KDE/Qt、Qtopia、Qt/Embedded、QSA、PyQt 等各類心得討論。

版主: AceLan, Franklin

[請教]如何抓取目前螢幕的滑鼠座標位置?

文章ming0630 » 週三 9月 30, 2009 2:05 pm

請教各位大大,如何將目前螢幕滑鼠移動的座標位置(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->x(), event->y());
this->setText(msg);
}
void EventLabel::mousePressEvent(QMouseEvent *event)
{
QString msg;
msg.sprintf("<center><h1>Press: (%d, %d)</h1></center>", event->x(), event->y());
this->setText(msg);
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
QString msg;
msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->x(), event->y());
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();
}
ming0630
可愛的小學生
可愛的小學生
 
文章: 11
註冊時間: 週三 9月 30, 2009 1:43 pm

Re: [請教]如何抓取目前螢幕的滑鼠座標位置?

文章訪客 » 週三 9月 30, 2009 11:13 pm

void Frame::mouseMoveEvent(QMouseEvent *e)
{
move_x=e-> globalX();//這是螢幕絕對座標
}

ming0630 寫:請教各位大大,如何將目前螢幕滑鼠移動的座標位置(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->x(), event->y());
this->setText(msg);
}
void EventLabel::mousePressEvent(QMouseEvent *event)
{
QString msg;
msg.sprintf("<center><h1>Press: (%d, %d)</h1></center>", event->x(), event->y());
this->setText(msg);
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
QString msg;
msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->x(), event->y());
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();
}
訪客
 

文章ming0630 » 週三 9月 30, 2009 11:48 pm

修改了mouseMoveEvent 如下:
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
QString msg;
msg.sprintf("<center><h1>Move: (%d, %d)</h1></center>", event->globalX(), event->globalY());
this->setText(msg);
}

滑鼠若在該Label Form 的區域裡,雖然是顯示視窗的絕對座標,但是滑鼠若移出這個視窗後,仍然無法即時顯示滑鼠座標?
ming0630
可愛的小學生
可愛的小學生
 
文章: 11
註冊時間: 週三 9月 30, 2009 1:43 pm

文章ming0630 » 週四 10月 01, 2009 10:47 pm

我有找到解決的方法了,
在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

要小心慎用,不知道還有沒有人有更好的方法可以提供呢?
ming0630
可愛的小學生
可愛的小學生
 
文章: 11
註冊時間: 週三 9月 30, 2009 1:43 pm


回到 KDE/Qt 程式設計

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客