5

メイン ウィンドウにウィジェットがあり、ウィジェットでのみマウスの位置を追跡したいとします。これは、ウィジェットの左下隅がローカル (0, 0) でなければならないことを意味します。

Q: どうすればいいですか?

ps 以下の関数の NON はそれを行います。

widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
4

2 に答える 2

10

残念ながら、「左下は(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();
}

...ウィジェット内のマウス ポインターの座標が表示されます。

于 2013-08-31T19:31:03.810 に答える
6

ウィジェットの左下隅が (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();
}
于 2013-09-02T15:50:28.800 に答える