Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: knf от Декабря 28, 2013, 11:17



Название: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Декабря 28, 2013, 11:17
Есть поле 4х4 из клеток в QGraphicsView. На вью итемы. Итемы свободно перемещаются по полю. Но надо, чтобы они устанавливались при перемещении в центре клетки. Знаю что надо использовать mouseRelealseEvent, но из-за нехватки знаний Qt не знаю как реализовать. А надо... Прошу помощи:)


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: Fregloin от Декабря 28, 2013, 15:38
они должны устанавливаться по центру клетки при отпускнии кнопки мыши или как?


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Декабря 28, 2013, 17:17
Именно


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: Racheengel от Января 01, 2014, 21:57
вот примерно так я это у себя делал... m_gridSize - это, соответственно, размер ячейки сетки в пикселях

Код:
            QList<QGraphicsItem*> selectedList = selectedItems();

            // check for grid snap
            if (!selectedList.isEmpty() && m_gridEnabled)
            {
                // correct selected items' coordinates
                for (QList<QGraphicsItem*>::iterator it = selectedList.begin(); it != selectedList.end(); it++)
                {
                    QPointF itemPos = (*it)->scenePos();
                    (*it)->setPos(QPointF(
                                      (int)itemPos.x() - (int)itemPos.x() % m_gridSize,
                                      (int)itemPos.y() - (int)itemPos.y() % m_gridSize));
                }

                return;
            }


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Января 10, 2014, 21:05
Нарисовал таким образом сетку, но я так понял, что она бесконечно прокручивается(повторяется) влево, вправо, вниз и вверх, при выходе фишки за границы..
Код:
inline qreal MyScene::round(qreal val, int step)
{
    int tmp = int(val) + step ;
       tmp -= tmp % step;
       return qreal(tmp);
}

void MyScene::drawBackground(QPainter *painter, const QRectF &rect)
{
    int step = 50;
    qreal start = round(rect.top(), step);
    if (start > rect.top())
    {
        start -= step;
    }
    for (qreal y = start ; y < rect.bottom(); )
    {
        y += step;
        painter->drawLine(rect.left(), y, rect.right(), y);
    }

    start = round(rect.left(), step);
    if (start > rect.left())
    {
        start -= step;
    }
    for (qreal x = start - step; x < rect.right(); )
    {
        x += step;
        painter->drawLine(x, rect.top(), x, rect.bottom());
    }
}


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Января 10, 2014, 21:11
Код:
qreal left = int(rect.left()) - (int(rect.left()) % 50);
    qreal top = int(rect.top()) - (int(rect.top())% 50);

    QVarLengthArray<QLineF, 100> lines;

    for(qreal x= left; x < rect.right(); x += 50)
        lines.append(QLineF(x, rect.top(),x,rect.bottom()));
    for (qreal y = top; y < rect.bottom(); y += 50)
               lines.append(QLineF(rect.left(), y, rect.right(), y));
    painter->drawLines(lines.data(),lines.size());
Вот ещё вариант проще, получается то же самое...


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: Racheengel от Января 10, 2014, 21:19
есть чудо-функция setSceneRect(), которая позволяет задать размеры активной области сцены.
именно этот размер будет возвращаться в функции sceneRect().
его и надо использовать для рисования.


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Января 10, 2014, 21:27
Задал размеры активной области. В каких координатах теперь устанавливать фишки?
blackChip1 = this->addEllipse(0,0,SIZECHIP,SIZECHIP,QPen(Qt::black),QBrush(Qt::black)); Фишки нет

blackChip1 = this->addEllipse(10,10,SIZECHIP,SIZECHIP,QPen(Qt::black),QBrush(Qt::black)); Фишки нет.


Название: Re: mouseReleaseEvent в QGraphicsView
Отправлено: knf от Января 10, 2014, 21:31
Ступил, разобрался.
Не правильно задал область..