I'm writing a program that can display file in bit view. Bits are visualized as filled and empty circles. Orogram allows to group bits by period, select bits, highlight columns and rows etc. I'm using Qt6 and c++.
I'm trying to use paintEvent + QPainter but when I draw ~32k bits main window started to freeze and crushes. How can I draw for example 1MB file without freezes?
Bits should be displayed like this( columns size can be changed).
This is code I have so far. Just simple visualization and bit generating. Generated 10K bits and main window is freezing while scrolling.
#include <QApplication>#include <QGraphicsView>#include <QGraphicsScene>#include <QGraphicsEllipseItem>#include <QToolTip>#include <QDebug>class BitItem : public QGraphicsEllipseItem{public: BitItem(int index, int radius, QGraphicsItem* parent = nullptr) : QGraphicsEllipseItem(parent), index_(index) { setRect(0, 0, radius, radius); } void SetValue(int value) { value_ = value; update(); } int GetValue() const noexcept { return value_; }protected: void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override { painter->setRenderHint(QPainter::Antialiasing); QBrush brush(Qt::SolidPattern); if (value_) brush.setColor(Qt::black); else brush.setColor(Qt::white); painter->setBrush(brush); painter->drawEllipse(rect()); }private: unsigned index_{0}; bool value_{false};};class BitsView : public QGraphicsView{public: BitsView(QWidget* parent = nullptr) : QGraphicsView(parent) { QGraphicsScene* scene = new QGraphicsScene(this); setScene(scene); GenerateBits(scene); setRenderHint(QPainter::Antialiasing); } void GenerateBits(QGraphicsScene* scene) // debug function { srand(time(nullptr)); for (int i = 0; i < BITS_COUNT_; ++i) { int row = i / COLUMN_SIZE_; int column = i % COLUMN_SIZE_; int x = column * (RADIUS_ + RADIUS_); int y = row * (RADIUS_ + SPACING_); BitItem* bit = new BitItem(i, RADIUS_); bit->SetValue(rand() % 2); bit->setPos(x, y); scene->addItem(bit); } }protected: void resizeEvent(QResizeEvent* event) override { QGraphicsView::resizeEvent(event); UpdateBitPositions(); }private: unsigned SPACING_{ 2 }; unsigned BITS_COUNT_{ 10000 }; unsigned COLUMN_SIZE_{ 64 }; unsigned RADIUS_{ 10 }; void UpdateBitPositions() { QGraphicsScene* scene = this->scene(); if (!scene) return; int row{ 0 }, column{0}; for (QGraphicsItem* item : scene->items()) { item->setPos(column * (RADIUS_ + SPACING_), row * (RADIUS_ + SPACING_));++column; if (column == COLUMN_SIZE_) { column = 0;++row; } } }};int main(int argc, char* argv[]){ QApplication app(argc, argv); BitsView bits_view; bits_view.show(); return app.exec();}