2016-09-26 4 views
0

Я работаю над визуализационным SW, который использует QGraphicsView и QGraphicsScene (Qt4.8, PyQt). Мне нужно LOD (уровень детализации) обработки в зависимости от уровня масштабирования. Для этого я создаю больше QGraphicsScenes, и я представляю всю сцену каждому с различным уровнем LOD. (Для каждого уровня LOD существует QGraphicsScene). Я переключаюсь между этими QGraphicsScenes в зависимости от уровня масштабирования. (QGraphicsView.setScene()). Большая проблема в том, что ScrollBars QGraphicsView сбрасывает свои позиции при вызове setScene().QGraphicsView уровень обработки деталей

Вот фрагмент кода, который пытается восстановить значения ScrollBars, но он не работает:

 hsb = self.horizontalScrollBar() 
     vsb = self.verticalScrollBar() 
     hv, vv = hsb.value(), vsb.value() 
     self.lod = i 
     self.setScene(self.scenes[self.lod]) 
     hsb.setValue(hv) # this simply doesn't work !!!! 
     vsb.setValue(vv) 

Любая идея, чтобы сохранить позиции на прокручивание? Или любая идея для эффективной обработки LOD? Я мог бы попытаться связать значение ScrollBar с измененными сигналами в некоторые пользовательские слоты, которые отключили бы от его собственного сигнала, чем повторно установили значение ScrollBar из сохраненного. Это было бы очень хромым и уродливым решением.

ответ

3

Предлагаю использовать одну сцену для управления разным уровнем детализации. Вы можете получить текущий уровень детализации непосредственно внутри метода QGraphicsItem::paint и нарисовать элемент соответствующим образом.

Пример C++:

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    qreal levelOfDetail = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform()); 
    //draw the item depending on the level of detail 
} 

Python

def paint(self, painter, option, widget): 
    levelOfDetail = QStyleOptionGraphicsItem.optionlevelOfDetailFromTransform(painter.worldTransform()) 
    #draw the item depending on the level of detail 

QStyleOptionGraphicsItem::levelOfDetailFromTransform См (для PyQt4 QStyleOptionGraphicsItem.levelOfDetailFromTransform)

Для большой сцены с большим количеством элементов, рассмотрим группировать элементы. Вы можете проверить уровень детализации, когда изменение сцены (или преобразование вида) изменится и отобразит/спрячет группу элементов. См. QGraphicsItemGroup.

+0

Здравствуйте! Я также читал об этом решении. Но когда у вас есть около 100100 графических элементов, и вы хотите отображать только 100, это довольно неэффективно, чтобы принять решение для каждых 100000 графических элементов, которые не будут отображаться. Разве нет лучшего решения? – Endre

+0

Возможно, вы можете сгруппировать элементы? Или создать своего рода иерархию? Вы можете отображать/скрывать группу элементов при изменении уровня данных (вы можете проверить уровень даты, когда изменения сцены (или представления) меняются). – Fabio

+0

Группировка кажется хорошей идеей. Я буду искать это. Благодаря! – Endre

Смежные вопросы