2015-11-18 5 views
1

Поскольку мне кажется, что мне нужно улучшить производительность моего кода, я хотел спросить, насколько хороша производительность QGraphicsPixmapItem::setPixmap(*Qimage)? My Image is 1024x1024 px и обновляется каждые 2,5 секунды. Но мне нужно, чтобы он обновлялся намного быстрее (4096x каждые 2,5 секунды в лучшем случае). Возможно ли с QGraphicsPixmapItem::setPixmap(*Qimage)? Я заполняю каждый пиксель QImage непосредственно массивом: array[y*SCENEWIDTH+x] = color.QGraphicsPixmapItem :: setPixmap() Производительность?

Но с такой скоростью QGraphicsPixmapItem::setPixmap(*Qimage), похоже, заморозит мой графический интерфейс. Цель состоит в том, чтобы отображать огромные количества данных, поступающих в полярные координаты (азимут на азимут) (радиолокационное видео).

Любые предложения? Спасибо!

+1

* Но мне нужно, чтобы оно обновлялось намного быстрее (4096x каждые 2,5 секунды в лучшем случае) .. * 4096/2.5 = 1638 раз в секунду. Для плавных графических переходов вам требуется всего 60 кадров в секунду, так почему вы считаете, что вам нужно быстро обновить изображение? – TheDarkKnight

+0

@ TheDarkKnight Возможно, он имеет значение 4096x4096, изображение должно обновляться каждые 2,5 секунды. – thuga

+0

@ TheDarkKnight Я тоже думал об этом, ну, 4096 был бы идеальным. Хорошо, я согласен с вами, что мне нужно всего лишь 60 кадров в секунду (и, возможно, немного больше), но даже с гораздо меньшей скоростью (около 5 кадров в секунду) мой графический интерфейс становится довольно медленным и замерзает на короткое время. Когда я удаляю только 'QGraphicsPixmapItem :: setPixmap (* Qimage), все работает отлично, поэтому я думаю, что проблема должна быть здесь. – honiahaka10

ответ

1

Вместо использования QGraphicsPixmapItem и установки изображения каждый раз, я предлагаю создать собственный класс, полученный из QGraphicsItem, и обновить член QImage. Вот пример, который показывает плавный переход обновления 1024 х 1024 изображений (обратите внимание, что он использует C++ 11)

class MyImage : public QGraphicsItem 
{ 
public: 

    MyImage() 
     :QGraphicsItem(NULL) 
    { 
     img = QImage(1024, 1024, QImage::Format_RGB32); 
     static int red = 0; 
     static int green = 0; 
     static int blue = 0; 
     img.fill(QColor(red++%255, green++%255, blue++%255)); 

     QTimer* pTimer = new QTimer; 
     QObject::connect(pTimer, &QTimer::timeout, [=](){ 

      // C++ 11 connection to a lambda function, with Qt 5 connection syntax 
      img.fill(QColor(red++%255, green++%255, blue++%255)); 
      update(); 
     }); 

     pTimer->start(1000/30); // 30 frames per second 
    } 

private: 
    virtual QRectF boundingRect() const 
    { 
     return QRectF(0, 0, 1024, 1024); 
    } 

    QImage img; 

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) 
    { 
     painter->drawImage(0, 0, img); 
    } 
}; 

Если создается экземпляр этого класса и добавить его в QGraphicsScene, вы должны увидеть гладкий переход рисунка, изменение цвета с черного на белый.

+0

Спасибо, я просто хотел попробовать, но ваш оператор 'QObject :: connect()', кажется, создает проблемы: нет доступа к защищенному члену QTimer :: timeout и многим синтаксическим серверам. Также ваш оператор связи выглядит довольно странно для меня ... Когда я пытаюсь сделать свой собственный оператор соединения, он не работает ни с QObject :: connect (pTimer, SIGNAL (timeout()), это, SLOT (updateImage())) ; ' – honiahaka10

+0

Соединение - это синтаксис Qt 5 с [C++ 11] (http://stackoverflow.com/questions/19398438/c-qt-how-to-add-std-c11-to-the-makefile- который-is-generated-by-qmake/19398489 # 19398489), что позволяет подключаться к лямбда-функции. Даже если вы не используете C++ 11, вам действительно нужно принять синтаксис соединения Qt 5, поскольку он предоставляет проверки времени компиляции, которые недоступны при использовании старых макросов SIGNAL и SLOT. – TheDarkKnight

+0

Если ваше соединение updateImage() не работает, вам нужно объявить его как слот и наследовать от QGraphicsObject, а не QGraphicsItem. QGraphicsObject предоставляет функциональные возможности сигналов и слотов. Используя C++ 11 и соединение Qt 5, вы можете подключиться к любой функции, даже если она не объявлена ​​как слот, поэтому она работает в приведенном выше примере. – TheDarkKnight

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

  • Нет связанных вопросов^_^