Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Горбаг
134 / 134 / 46
Регистрация: 25.09.2014
Сообщений: 691
Завершенные тесты: 2
#1

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

01.06.2016, 18:16. Просмотров 449. Ответов 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 - C++ Qt
Здравствуйте, я только еще учу Qt и с++, подскажите в где мои ошибки пытаюсь создать класс mvscene в котором хочу разместить все элементы...

QGraphicsView - C++ Qt
Как добиться того что бы QGraphicsView автоматически изменял свой размер в соответствии с размером сцены?

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

QGraphicsView openGL - C++ Qt
Помогите разобраться, поискал в интернете, но ничего толком не нашел. в документации написано, чтобы задействовать openGl достаточно...

Координаты в QGraphicsView - C++ Qt
it=new QGraphicsRectItem(QRect(202,20,80,80)); что бы я не писал в конструкторе в 1 и 2, квадрат всегда в центре сцены, я не понимаю &gt;_&lt;...

QGraphicsView and QGraphicsScene - C++ Qt
При нажатии на левую клавишу мыши у меня должен получаться элипс, который рисуется на QGraphicsScene, а QGraphicsScene отображает свое...

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
Горбаг
134 / 134 / 46
Регистрация: 25.09.2014
Сообщений: 691
Завершенные тесты: 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 sizeIncrement - C++ Qt
У меня не получается изменять размер QGraphicsView инкрементно на 20. main.cpp #include &lt;QApplication&gt; #include &lt;QGraphicsView&gt; ...

Отрисовка на QGraphicsView - C++ Qt
Доброго времени суток. Есть необходимость рисовать именно на QGraphicsView. Рисунок - прямоугольник, должен уметь: 1. изменять свои...

QGraphicsView фокусировка - C++ Qt
Собственно вопрос такой можно но ли как то сфокусировать QGraphicsView на координаты? Например 200, 388, первое х второе y. Если нельзя, то...

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


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

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

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