Qgraphicsscene 在函数内部获取 scenePos() 的麻烦

Qgraphicsscene troubles to get scenePos() inside a function

我已经对 qgraphicsscene 进行了子类化,并试图在 "normal" 函数中获取鼠标坐标。我只让它在 "mouse involved" 函数上工作。对不起,我是业余程序员。

例如,这里的 scenePos() 有效:

void mousePressEvent(QGraphicsSceneMouseEvent *event)
  {
// qDebug() << "Custom scene clicked.";
   if(event->modifiers() == Qt::ControlModifier) {
        if(event->button() == Qt::LeftButton) {
            QPointF pos = {event->scenePos().x(), 70};
            addChordnueve(pos); // crea 1 item at mouse x e y = 70
//        } if(event->modifiers() == Qt::ControlModifier & event->modifiers() == Qt::ShiftModifier) {
   qDebug() << "Control!!!";}}

在这里它根本不起作用,但是 QCursor::pos() 给出了 "weird" 个位置:

void preaddExtChord()
{
    auto *hellos = scenePos(); //<- It doesn't works

    int xplace = QCursor::pos().x()-620;
    int yplace = QCursor::pos().y()-380;

    QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n");
    item->setFont(QFont ("omheads", 20));
    item->setPos(xplace, yplace);
    addItem(item);
}

几个月来我搜索了很多但找不到解决方案,... 也许我做错了方法,或者有一些更容易的方法可以在这种类型的函数中获取鼠标坐标?

谢谢! :-)

如果你想获得相对于光标场景的位置,你必须首先获得QGraphicsView在光标下方(QGraphicsScene可以是QGraphicsView的一部分),为此我们必须迭代并验证它是否在视口,然后使用 QGraphicsView 的 mapToScene 方法计算相对于场景的位置:

QPoint p = QCursor::pos();
for(QGraphicsView *view: views()){
    QWidget *viewport = view->viewport();
    QRect vr = viewport->rect();
    QPoint vp = viewport->mapFromGlobal(p);
    if(vr.contains(vp)){
        QPointF sp = view->mapToScene(vp);
        QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n");
        item->setFont(QFont("omheads", 20));
        item->setPos(sp);
        addItem(item);
    }
}