2013-04-16 6 views
1

Я пытаюсь использовать графическую структуру Qt для рисования графика с большим количеством узлов (2000+). Используя QGraphicsView и QGraphicsScene, я легко рисую большое количество эллипсов с помощью метода addEllipse(), но изменение цвета элементов с помощью setBrush() происходит слишком медленно. Я также попытался использовать QGraphicsPixmapItem, а затем просто переключить pixmap, чтобы изменить цвет, но это также не работает. Можете ли вы дать мне совет, как это сделать? Является ли использование OpenGL единственным способом повысить производительность?Много QGraphicsItem

Большое спасибо.

Редактировать: У меня нет примера кисти. Поставит его позже. код просто поменять кисти эллипса больше ничего,

Edit: Pixmap пример (код в Python с PyQt):

def startTest(self): 
    self.n = 1000 
    self.c = 1 
    self.scene = QtGui.QGraphicsScene() 
    self.scene.setSceneRect(0,0,500,500) 
    self.graphicsView.setScene(self.scene) 
    self.redPix = QtGui.QPixmap(5, 5) 
    self.redPix.fill(QtGui.QColor(255,0,0)) 
    self.blackPix = QtGui.QPixmap(5, 5) 
    self.blackPix.fill(QtGui.QColor(0,0,0)) 

    for i in range(0,self.n): 
     temp = QtGui.QGraphicsPixmapItem(self.redPix) 
     temp.setPos(random.uniform(10, 490),random.uniform(10, 490)) 
     self.scene.addItem(temp) 

def updateNodes(self): 

     if self.c: 
      for i in self.scene.items(): 
       i.setPixmap(self.blackPix) 
      self.c = 0 
     else: 
      for i in self.scene.items(): 
       i.setPixmap(self.redPix) 
      self.c = 1 
+1

Вы можете разместить код? – UmNyobe

ответ

0

Вы пытались указать с помощью параметра метода addEllipse()brush?

QBrush blueBrush = QBrush(Qt::blue); 
QPen noPen; 
scene.addEllipse(x, y, w, h, noPen, blueBrush); 
0

Ну, может быть, это будет не очень популярный ответ .. но из моего опыта, я не думаю, что QGraphicsScene/View способ применим на что-то с 1000K + объектами. Это отличная фреймворк, обладающий множеством приятных функций, но способ, которым он разработан, делает его очень медленным для большого количества объектов.

Размер кода, который вы должны сделать самостоятельно (если вы хотите получить достойную производительность с таким количеством объектов)/под этим я подразумеваю отсечение/фильтрацию/возможно обобщение /, действительно, слишком много в сравнении, если вы создаете собственную задачу зависимого ядра рендеринга.

Я использую Qt много в течение многих лет и пытался использовать View/Scene для серьезных графических компонентов (различные форматы карт просматривают виды SDK, 2D-графики) и каждый раз, когда я заканчивал работу с самодельным движком рендеринга.

Основная причина в том, что Qt пытается предоставить вам очень общий код , и это очень хорошо способ обработки графических объектов. Они имеют очень хорошо продуманную матрицу преобразований, double основанные координаты, общие подходы к моделированию, но цена заключается в том, что они пропускают все наиболее распространенные принципы оптимизации для heavy графических изображений.

+0

Спасибо за ответ. Однако мне удалось это сделать с помощью виджета OpenGl. Без какой-либо оптимизации мне удалось нарисовать 20k узлов, которые переключают цвет 2 раза в секунду. – user2127166

+0

поздравления! хотя 2 кадра в секунду - это не так уж и так =) Я нормально работаю с представлениями, начиная с 40-50K элементов с масштабированием в реальном времени/вращением/etc. – evilruff

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