Просмотр сообщений
|
Страниц: 1 ... 46 47 [48] 49 50 ... 96
|
706
|
Qt / Пользовательский интерфейс (GUI) / (РЕШЕНО) Сохранение и восстановление позиции вьюпорта на сцене
|
: Февраля 19, 2015, 14:11
|
Надо сохранять в настройках положение вьюпорта QGraphicsView на QGraphicsScene и восстанавливать при запуске. Влоб соответствующих простых вызовов типа QPointF QGraphicsView::saveViewport(); void QGraphicsView::restoreViewport(QPointF)
нет. Также нет сигнала от QGraphicsView об изменении положения его вьюпорта на сцене. Получается немного косая конструкция: 1) для отслеживания изменений положения вьюпорта делаем один приемник сигналов перемещения от обоих скроллбаров вьюпорта 2) в этом приемнике положение вьюпорта получаем в виде QPointF pos = ui->graphicsView->mapToScene( 0, 0 );
3) при выходе из приложения сохраняем положение вьюпорта в виде этого QPointF 4) при запуске приложения восстанавливаем положение вьюпорта с помощью ui->graphicsView->scrollContentsBy( (int)pos.x(), (int)pos.y() );
Я прав? Кто такое же делал - может есть более элегантный путь, и я его не увидел?
|
|
|
707
|
Qt / 2D и 3D графика / Re: QGraphicsItem::collidingItems() что-то не то выдает
|
: Февраля 18, 2015, 20:53
|
Нет, я так не делаю. Бокс ровно такой, как элемент. Но мне нужно проверять при движении элементов, чтобы они не подходили к друг другу ближе определенного расстояния (в моем случае 2 шага сетки). Чтобы между ними всегда было некоторое расстояние. Например, если роняют один объект слишком близко к другому, чтобы он отскакивал на минимальное допустимое расстояние. Делать бокс с учетом этого расстояния не имеет никакого смысла - снаружи своего настоящего бокса сам айтем ничего никогда рисовать не будет. Проверка на расстояние чисто внешняя для айтема.
|
|
|
708
|
Qt / 2D и 3D графика / Re: QGraphicsItem::collidingItems() что-то не то выдает
|
: Февраля 18, 2015, 20:17
|
Вот блин...  А мне надо проверять на некотором расстоянии от фигуры. Получается, надо перед вызовом проверки пересчитывать boundingBox, потом возвращать обратно. Причем, если бы при флаге Qt::IntersectsItemShape проверка делалась только на шейп, игнорируя бокс - то всё бы без проблем работало.  PS: а блин, нихрена не получится с подменой - надо ведь менять boundingBox для всех айтемов соответствующего типа на сцене  Выходит, единственный вариант - самому искать с кем увеличенный шейп пересекается. 
|
|
|
709
|
Qt / 2D и 3D графика / Re: QGraphicsItem::collidingItems() что-то не то выдает
|
: Февраля 18, 2015, 20:06
|
оба-на... а нигде ведь не сказано, что обязательно внутри прямоугольника, и самое смешное, что работает шейп больше прямоугольника, но только для того айтема, проверка которого вызывается
и не вполне ясно, с чего бы не работало во всех случаях - координаты то qreal, ну и что, что они отрицательные
|
|
|
710
|
Qt / 2D и 3D графика / (РЕШЕНО) QGraphicsItem::collidingItems() что-то не то выдает
|
: Февраля 18, 2015, 19:23
|
Описал шейп у графического айтема в виде прямоугольника размером больше, чем boundingRect, ну так надо. Проверяю как работает - кидаю такой айтем рядом с другим точно таким же айтемом на сцене. Далее под "падающим" я подразумеваю тот айтем, метод collidingItems() которого вызывается чтобы получить список тех, на кого он упал. Наблюдаю странное поведение - подлежащие айтемы появляются в списке только когда под шейп падающего попадает описывающий прямоугольник подлежащего, но не его шейп. Флаг по умолчанию mode = Qt::IntersectsItemShape. В доке написано: The way collisions are detected is determined by applying mode to items that are compared to this item, i.e., each item's shape or bounding rectangle is checked against this item's shape. (выделено мной) На всякий случай явно указал параметром collidingItems( Qt::IntersectsItemShape ) - та же фигня. Так эта... Что указывает параметр - использование шейп у падающего или подлежащих? Что должно использоваться у подлежащих айтемов? shape или boundingRect? Я вижу, что используется boundingRect - а как сделать, чтобы у них тоже shape использовался? Рыл, рыл... не нарыл... Или это баг? Кто-нибудь еще сталкивался с таким?
|
|
|
714
|
Qt / Пользовательский интерфейс (GUI) / (РЕШЕНО) Какой-нибудь заметный выступ на QSplitter.
|
: Февраля 17, 2015, 23:30
|
Замечательная штука, можно не только делать два соседних окна с изменением пропорций, но и схлопывать одно из них. Однако не видно, как можно проинформировать пользователя об этих возможностях, кроме изменения вида курсора при наезде. А когда одно окно схлопнуто, то вообще сложно сразу понять, что там что-то спрятано. Нужен какой-то индикатор, но его нет. И не ясно, можно ли его как-то привязать, если не наследовать QSplitter, а напрямую использовать его в дизайнере. Логично было бы привесить к нему, как к родителю какое-то изображение, свой QWidget, на котором малевать что хочется. Но не видно такой возможности. Может плохо смотрю?
|
|
|
715
|
Qt / Пользовательский интерфейс (GUI) / Re: QDrag по сетке
|
: Февраля 16, 2015, 12:22
|
Если кому-то сильно интересно, чем закончилось: я остановился на том же режиме, как в дизайнере, то есть, перемещение свободное, привязка к сетке. Разумеется, пришлось нарисовать сетку из точек с помощью QGraphicsScene::drawBackground(). Я уверен, в дизайнере тоже так сделано потому что вариант со сменой способа перетаскивания при выходе со сцены получился бы слишком громоздким и плохо масштабируемым. Собственно, констатация факта: есть вот такой недостаток Qt - невозможно сделать QDrag по сетке. Если кому-то интересно развитие, здесь соответствующий feature request.
|
|
|
716
|
Qt / Пользовательский интерфейс (GUI) / Re: QDrag по сетке
|
: Февраля 16, 2015, 10:35
|
В программировании совместная работа с таким человеком невыносима Зато достигается именно поставленная цель, или хотя бы максимальное приближение к ней, а не "абы как бы чего-нибудь получилось". Впрочем, это уже полный оффтопик.
|
|
|
717
|
Qt / Пользовательский интерфейс (GUI) / Re: QDrag по сетке
|
: Февраля 16, 2015, 10:28
|
Сделайте специальный айтем, который будет показывать квадратик того, куда драгающийся айтем упадет. А курсор пусть двигается как хочет.
Курсор штатным QDrag таскает то же изображение, которое лежит на сцене, это обязательно. Объекты на сцене разные, у них разные изображения и размеры иконок. Если при этом еще какой-то квадратик будет ездить... 
|
|
|
718
|
Qt / 2D и 3D графика / Соединение двух точек "проводами"
|
: Февраля 15, 2015, 22:43
|
Стандартная задача - соединять две точки (QPointF в нашем случае) "проводами", которые проходят только по вертикали и горизонтали, и поворачивают только под прямым углом. При этом не накладываются на прочие элементы изображения, а другие подобные линии могут пересекать тоже только под прямым углом. Линии должны сами выбирать где им "ломаться" и сами должны располагаться на оптимальном расстоянии от других айтемов сцены. С возможностью изменять их положение драгом. Такие линии есть в Visio, OpenOffice Draw и других пакетах. Делалось многими и много раз. В самом Qt такой штуки, увы нет. Разумеется, и я сам могу сделать за несколько дней. Но может уже есть такое готовое для QGraphicsScene, типа набора QWT? Может не надо изобретать велосипед? Может есть сторонняя готовая библиотека? Или хотя бы, как называется такой тип объектов, но так чтобы при поиске не путаться в бесчисленных описаниях connection сигналов-слотов, QGraphicsLine и QRubberBand.
|
|
|
719
|
Qt / Пользовательский интерфейс (GUI) / Re: QDrag по сетке
|
: Февраля 11, 2015, 11:11
|
Пока не видно, как это вообще сделать. Надо полностью перехватить перемещения мыши при выполнении драга, чтобы системный курсор не двигался. Но при этом умудриться выдавать событие QGraphicsSceneDragDropEvent в сцену.
Скрыть курсор и нарисовать его в имедже драга У QCursor нет метода "скрыть". Есть методы, меняющие изображение, форму, позицию. Очевидно, они не влияют на обработку перемещения мыши.
|
|
|
720
|
Qt / Пользовательский интерфейс (GUI) / Re: QDrag по сетке
|
: Февраля 10, 2015, 16:42
|
Описывал уже в начале, почему это не годится. Такой галимый макдональдс получится, что заранее тошно.
Можно попробовать замиксить - QDrag для внешних окон и двигание айтема на сцене. Вот это и будет кошмарный гамбургер...
|
|
|
|
|