Russian Qt Forum
Июля 07, 2025, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: mouseReleaseEvent в QGraphicsView  (Прочитано 4775 раз)
knf
Гость
« : Декабря 28, 2013, 11:17 »

Есть поле 4х4 из клеток в QGraphicsView. На вью итемы. Итемы свободно перемещаются по полю. Но надо, чтобы они устанавливались при перемещении в центре клетки. Знаю что надо использовать mouseRelealseEvent, но из-за нехватки знаний Qt не знаю как реализовать. А надо... Прошу помощи:)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабря 28, 2013, 15:38 »

они должны устанавливаться по центру клетки при отпускнии кнопки мыши или как?
Записан
knf
Гость
« Ответ #2 : Декабря 28, 2013, 17:17 »

Именно
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Января 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;
            }
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
knf
Гость
« Ответ #4 : Января 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());
    }
}
Записан
knf
Гость
« Ответ #5 : Января 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());
Вот ещё вариант проще, получается то же самое...
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Января 10, 2014, 21:19 »

есть чудо-функция setSceneRect(), которая позволяет задать размеры активной области сцены.
именно этот размер будет возвращаться в функции sceneRect().
его и надо использовать для рисования.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
knf
Гость
« Ответ #7 : Января 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)); Фишки нет.
Записан
knf
Гость
« Ответ #8 : Января 10, 2014, 21:31 »

Ступил, разобрался.
Не правильно задал область..
« Последнее редактирование: Января 10, 2014, 21:33 от knf » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.026 секунд. Запросов: 19.