Проблемы с Qgraphicsscene, чтобы получить scenePos () внутри функции - PullRequest
1 голос
/ 18 марта 2019

Я подклассифицировал qgraphicsscene и пытаюсь получить координаты мыши внутри «нормальной» функции. Я только заставляю его работать с функцией "задействована мышь". Извините, я программист-любитель.

Например, работает 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 () дает "странные" позиции:

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);
}

Я искал много месяцев, но не смог найти решение ... может быть, я делаю неправильный подход, или есть более простая возможность получить координаты мыши внутри этого типа функций?

Спасибо! : -)

1 Ответ

0 голосов
/ 18 марта 2019

Если вы хотите получить позицию относительно сцены курсора, вы должны сначала получить, что QGraphicsView находится ниже курсора (QGraphicsScene может быть частью QGraphicsView), для этого мы должны выполнить итерацию и проверить, находится ли она внутри области просмотра, затем вычислите положение относительно сцены, используя метод mapToScene QGraphicsView:

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);
    }
}
...