Russian Qt Forum
Ноябрь 23, 2024, 12:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прорисовка QGraphicsItem без потерь  (Прочитано 6051 раз)
Hrundel
Гость
« : Октябрь 09, 2013, 14:32 »

Всем  привет,

Делаю задание на практике: программа (nagios) ослеживает состояние участников сети. Моя задача написать для нее монитор.
В мониторе все участники сети представленны в виде дерева. Выглядит так:

http://www.fotolink.su/v.php?id=cf4912c1bdef5622ec39c6892928bbc8

Когда начинаю навигировать по дереву - то сцена бывает становится очень широкой... и тут возникает проблема - исчезают некоторые мосты. Причем они есть но показываются только тогда, когда узел попадает в зону видимости.

Выглядит вот так:
Это когда узел вне поля видимости

http://www.fotolink.su/v.php?id=df217b0167c562449b52caa518ecf9e4

это когда в поле

http://www.fotolink.su/v.php?id=0d4768057f3c3fa06416d09de426bafd

как сделать так, чтобы ветки отображались всегда,
иначе это слишком вводит в заблуждение?

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

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 09, 2013, 14:40 »

Когда начинаю навигировать по дереву - то сцена бывает становится очень широкой... и тут возникает проблема - исчезают некоторые мосты. Причем они есть но показываются только тогда, когда узел попадает в зону видимости.
Хм... что-то делается не так, ибо сцена при навигации не должна меняться.
Записан

Qt 5.11/4.8.7 (X11/Win)
Hrundel
Гость
« Ответ #2 : Октябрь 09, 2013, 14:51 »

прошу прощения за неясно выраженную мысль.
Под навигацией я имею ввиду перемещение вглубь дерева, а не сам скролинг.
Навагация осуществляется двойным щелчком по узлу
Сцена пересчитывается заново  и  по новой отображется.
Записан
_OLEGator_
Гость
« Ответ #3 : Октябрь 09, 2013, 15:04 »

Я так понимаю, надо чтобы вся информация на сцене была показана на экране, тогда надо подстраивать вью под размеры сцены:
Код
C++ (Qt)
void QGraphicsView::fitInView ( const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio )
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Октябрь 09, 2013, 15:10 »

Скроллинг то нужен или нет?
Записан

Qt 5.11/4.8.7 (X11/Win)
Hrundel
Гость
« Ответ #5 : Октябрь 09, 2013, 15:18 »

Скролинг - есть. Уменьшение увеличение - есть. Отображение всей сцены целиком - есть.
Проблема только в том что в если узел наследника лежит далеко за предлеами области видимости, то соединение между родителем и потомком не отображается. но если они оба в области видимости то появляется и соединение. Мне надо чтобы оно не исчезало.
Записан
_OLEGator_
Гость
« Ответ #6 : Октябрь 09, 2013, 15:39 »

Так бы и писал. Ты видимо не корректно размер элемента отдаешь, без учета этой соединительной линии. Поэтому сцена разумно даже не вызывает отрисовку, т.к. элемент полностью вне зоны видимости.
Записан
Hrundel
Гость
« Ответ #7 : Октябрь 09, 2013, 15:52 »

Начинаю понимать, но смутно. Можно подробнее?
Записан
_OLEGator_
Гость
« Ответ #8 : Октябрь 09, 2013, 15:59 »

В зависимости, как организовано определение границ, ты не учитываешь соединительную линию при переопределении этих функций:
Код
C++ (Qt)
QRectF QGraphicsItem::boundingRect () const [pure virtual]
bool QGraphicsItem::collidesWithPath ( const QPainterPath & path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const [virtual]
Записан
Hrundel
Гость
« Ответ #9 : Октябрь 09, 2013, 16:10 »

Спасибо, углублюсь в эту тему.
Записан
Hrundel
Гость
« Ответ #10 : Октябрь 09, 2013, 16:37 »

Не помогает пока.

Вот так определяю:

Код:
GraphNodeConnectionTopDown::GraphNodeConnectionTopDown(int w):
    bridgeWidth(w)
{
    //bridgePen.setColor(QColor(60,60,60,255));
    bridgePen.setColor(Qt::darkBlue);
    bridgePen.setWidth(1);
}

QRectF GraphNodeConnectionTopDown::boundingRect() const
{
    QPointF ptPositon(0,0);
    QSizeF size(bridgeWidth, 20);
    return QRectF(ptPositon, size);
}

Вот так вызываю:

Код:
GraphNodeConnectionTopDown* nodeBridge = new GraphNodeConnectionTopDown(width);
          nodeBridge->boundingRect();
          nodeBridge->setX(x1);
          nodeBridge->setY(bridgeYPos);
          nodeBridge->show();
          nodesConnectionGui.append(nodeBridge);

Все равно пропадают
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Октябрь 09, 2013, 16:49 »

Содержимое сцены зависит от размеров вью?
Записан

Qt 5.11/4.8.7 (X11/Win)
Hrundel
Гость
« Ответ #12 : Октябрь 09, 2013, 16:52 »

Нет, не зависит.

Кстати, пишу под Linux OpenSUSE
Не знаю , может ли подобный эффект зависеть от OS
« Последнее редактирование: Октябрь 09, 2013, 16:55 от Hrundel » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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