Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Hrundel от Октябрь 09, 2013, 14:32



Название: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 14:32
Всем  привет,

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

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

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

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

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

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

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

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



Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: GreatSnake от Октябрь 09, 2013, 14:40
Когда начинаю навигировать по дереву - то сцена бывает становится очень широкой... и тут возникает проблема - исчезают некоторые мосты. Причем они есть но показываются только тогда, когда узел попадает в зону видимости.
Хм... что-то делается не так, ибо сцена при навигации не должна меняться.


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 14:51
прошу прощения за неясно выраженную мысль.
Под навигацией я имею ввиду перемещение вглубь дерева, а не сам скролинг.
Навагация осуществляется двойным щелчком по узлу
Сцена пересчитывается заново  и  по новой отображется.


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: _OLEGator_ от Октябрь 09, 2013, 15:04
Я так понимаю, надо чтобы вся информация на сцене была показана на экране, тогда надо подстраивать вью под размеры сцены:
Код
C++ (Qt)
void QGraphicsView::fitInView ( const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio )


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: GreatSnake от Октябрь 09, 2013, 15:10
Скроллинг то нужен или нет?


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 15:18
Скролинг - есть. Уменьшение увеличение - есть. Отображение всей сцены целиком - есть.
Проблема только в том что в если узел наследника лежит далеко за предлеами области видимости, то соединение между родителем и потомком не отображается. но если они оба в области видимости то появляется и соединение. Мне надо чтобы оно не исчезало.


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: _OLEGator_ от Октябрь 09, 2013, 15:39
Так бы и писал. Ты видимо не корректно размер элемента отдаешь, без учета этой соединительной линии. Поэтому сцена разумно даже не вызывает отрисовку, т.к. элемент полностью вне зоны видимости.


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 15:52
Начинаю понимать, но смутно. Можно подробнее?


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: _OLEGator_ от Октябрь 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]


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 16:10
Спасибо, углублюсь в эту тему.


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 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);

Все равно пропадают


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: GreatSnake от Октябрь 09, 2013, 16:49
Содержимое сцены зависит от размеров вью?


Название: Re: Прорисовка QGraphicsItem без потерь
Отправлено: Hrundel от Октябрь 09, 2013, 16:52
Нет, не зависит.

Кстати, пишу под Linux OpenSUSE
Не знаю , может ли подобный эффект зависеть от OS