Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 747
Завершенные тесты: 2
#1

QGraphicsView - слежение за перемещаемым итемом - C++ Qt

01.06.2016, 18:16. Просмотров 514. Ответов 2
Метки нет (Все метки)

Добрый день.

Хочу сделать так, чтобы при перетаскивании итема по сцене, область просмотра перемещалась за итемом - то есть итем всегда был виден.

Переопределил QGraphicsView, QGraphicsScene, QGraphicsItem, набросал итемов на сцену.
Внутри mouseMoveEvent выставляю новую координату итему. Дальше, насколько я понял, есть два пути:
1) Изначально не задавать rect сцене, а внутри mouseMoveEvent итема после выставления координат писать что-то вроде graphicsViewPointer->ensureVisible(this), что автоматически изменяет размер сцены при перемещении итема. Если сцена становится больше области просмотра, то у viewport появляются слайдеры и при дальнейшем движении итема к краю экрана, итем уходит за область просмотра (видимую часть сцены), сцена расширяется, но итема мы не видим - область просмотра за ним не следует.
2) Изначально задать некие размеры rect сцены, внутри mouseMoveEvent итема после выставления координат вручную пересчитывать и задавать новые границы sceneRect через функцию QRectF::united(). Как итог - сцена увеличивается, но итем тоже уползает за границу видимой области и остается там.

Да, мы можем сделать центрирование на нужной нам области внутри mouseReleaseEvent(), но хочется, чтобы и в момент движения итема, пользователь его видел постоянно.

Я уже перерыл все базовые примеры, перерыл весь этот форум и оф.форум Qt, выручайте. Кто-нибудь делал слежение за итемом? Как заставить viewport смещаться вслед за итемом, не вызывая при этом бесконечных рекурский mouseMoveEvent итема?

Еще, например, я пытался вручную после изменения позиции итема сдвигать за ним слайдеры, но это просто дохлый номер. Нарочно в дебаге проверял - минимальное, текущее, максимальное значения слайдера. Так же выводил будущее, новое, значение. Все соответствует правде. Затем через setValue выставляю новое значение и пытаюсь здесь же в дебаге получить вывод текущего значения слайдера - строки, включая setValue, игнорируются. Если же в setValue передавать не вычисляемое значение, а, например, тупо 100, или 250, все строки работают. Примерно набросал:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void MoveItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    this->setPos(mapToScene(event->pos()));
    scene()->setSceneRect( scene()->sceneRect().united( /*itemToSceneRect*/this->sceneBoundingRect() ) ); 
 
    qDebug()<<"old value ="<<graphicsViewPointer->horizontalScrollBar()->value();   
    int someFutureValue = ...;
    qDebug()<<"future value ="<<someFutureValue; //все прекрасно, значение в дозволенном диапазоне слайдера
        graphicsViewPointer->horizontalScrollBar()->setValue(someNewValue); //не работает
        //ИЛИ
        graphicsViewPointer->horizontalScrollBar()->setValue(250); //работает
    qDebug()<<"new value ="<<graphicsViewPointer->horizontalScrollBar()->value(); //строка игнорируется, если до нее было ...setValue(someNewValue)
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2016, 18:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос QGraphicsView - слежение за перемещаемым итемом (C++ Qt):

QGraphicsView
Здравствуйте, я только еще учу Qt и с++, подскажите в где мои ошибки пытаюсь...

QGraphicsView
Как добиться того что бы QGraphicsView автоматически изменял свой размер в...

QGraphicsView openGL
Помогите разобраться, поискал в интернете, но ничего толком не нашел. в...

QGraphicsView в MainWindow
Суть моей задумки. Есть главное окно с меню, по нажатии на кнопку (в меню )...

QGraphicsView фокусировка
Собственно вопрос такой можно но ли как то сфокусировать QGraphicsView на...

Координаты в QGraphicsView
it=new QGraphicsRectItem(QRect(202,20,80,80)); что бы я не писал в...

2
Командор
0 / 0 / 0
Регистрация: 24.04.2016
Сообщений: 53
02.06.2016, 16:16 #2
Не заметил этой темы и создал новую, надо было сюда написать, искали бы вместе

Единственное что я нашел это менять координаты самой сцены, задаешь изменение a и b по нажатию на клавиши и сцена двигается относительно QGraphicsView, а не наоборот, похоже это единственный адекватный способ
C++ (Qt)
1
scene->setSceneRect(a,b,1800,1800);
Добавлено через 8 часов 5 минут
Этот способ не подходит, сцена постоянно меняется и нарисованные вначале сцены вещи пропадают

Больше ничего не нашел

Добавлено через 22 минуты
Нашел вот такой способ

C++ (Qt)
1
2
#include <QScrollBar>
view->horizontalScrollBar()->setValue()
Добавлено через 1 минуту
а, не выспался я походу, утром смотрел и вроде бы у тебя не было этого

Добавлено через 11 секунд
Но зато мне пригодится
0
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 747
Завершенные тесты: 2
03.06.2016, 09:27  [ТС] #3
Я пока так и не нашел корректного способа. При вызове setSceneRect мы повторно попадает в mouseMoveEvent элемента, который тащим мышью...

Добавлено через 1 час 35 минут
Таки нашел решение. Костыль, но работает. Дома буду - выложу.

Добавлено через 14 часов 48 минут
MoveItem.h - наследник QGraphicsItem
C++ (Qt)
1
2
3
private:
    bool isMouseMoving;
}
MoveItem.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MoveItem::MoveItem(QObject *parent) :
    QObject(parent), QGraphicsItem()
{
    isMouseMoving = false;
}
 
void MoveItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if( !isMouseMoving )
    {
        // задаем новую позицию айтема
 
        // проверяем, не ушел ли айтем за границы сцены, если ушел, то наращиваем сцену
        
        if ( //если айтем ушел за границы видимой области )
        {
            isMouseMoving = true;
            graphicsViewPointer->ensureVisible(this,0,0);
            isMouseMoving = false;
        }
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2016, 09:27
Привет! Вот еще темы с решениями:

Отрисовка на QGraphicsView
Доброго времени суток. Есть необходимость рисовать именно на QGraphicsView. ...

QGraphicsScene + QGraphicsView
Чего я пытаюсь добиться. На сцене главный элемент - круг. Этот круг должен быть...

QGraphicsView sizeIncrement
У меня не получается изменять размер QGraphicsView инкрементно на 20. main.cpp...

QGraphicsScene и QGraphicsView
У меня Qt 5.1.1. Компилируется, но ничего не отображается. Подскажите что не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru