メイン ウィンドウにウィジェットがあり、ウィジェットでのみマウスの位置を追跡したいとします。これは、ウィジェットの左下隅がローカル (0, 0) でなければならないことを意味します。
Q: どうすればいいですか?
ps 以下の関数の NON はそれを行います。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
メイン ウィンドウにウィジェットがあり、ウィジェットでのみマウスの位置を追跡したいとします。これは、ウィジェットの左下隅がローカル (0, 0) でなければならないことを意味します。
Q: どうすればいいですか?
ps 以下の関数の NON はそれを行います。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
残念ながら、「左下は(0,0)でなければならない」という要件に満足できないでしょう。Qt 座標系では (0,0) が左上です。それを受け入れることができれば。次のコード...
setMouseTracking(true); // E.g. set in your constructor of your widget.
// Implement in your widget
void MainWindow::mouseMoveEvent(QMouseEvent *event){
qDebug() << event->pos();
}
...ウィジェット内のマウス ポインターの座標が表示されます。
ウィジェットの左下隅が (0,0) で、Y が上に行くときに昇順であるかのように座標でマウスの位置を報告するだけの場合は、以下のコードでそれを行います。ただし、そのようなコードが必要な理由は見当違いだと思います。なぜなら、上記のウィジェット内の他のすべての座標はこのようには機能しないからです。では、なぜそれが必要なのか、私には理解できませんが、どうぞ。
#include <QtWidgets>
class Window : public QLabel {
public:
Window() {
setMouseTracking(true);
setMinimumSize(100, 100);
}
void mouseMoveEvent(QMouseEvent *ev) override {
// vvv That's where the magic happens
QTransform t;
t.scale(1, -1);
t.translate(0, -height()+1);
QPoint pos = ev->pos() * t;
// ^^^
setText(QStringLiteral("%1, %2").arg(pos.x()).arg(pos.y()));
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}