Bilderstream mit Qt @ anzeig
Die aktuelle Lösung sieht folgendermaßen aus:
//paintlabel.h
class PaintLabel : public QWidget
{
Q_OBJECT
public:
explicit PaintLabel(QWidget *parent = 0);
public slots:
void setImage(char *img_ptr, QSize img_size, int pitch);
protected:
void paintEvent(QPaintEvent *event) override;
private:
QImage image;
}
//paintlabel.cpp
PaintLabel::PaintLabel(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_NoSystemBackground, true);
}
void PaintLabel::setImageLive(char *img_ptr, QSize img_size, int pitch)
{
image = QImage((uchar *)img_ptr, img_size.width(), img_size.height(), pitch, QImage::Format_RGB32).scaled(this->size());
update();
}
void PaintLabel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter;
painter.begin(this);
if (!image.isNull()) {
const QPoint p = QPoint(0,0);
painter.drawImage(p, image);
}
painter.end();
}
Ich erwarte 20-40 Bilder pro Sekunde. Das Problem ist, dass die Leistung mit der Größe sehr schlecht skaliert. Bei der Größe um fullHD dauert das Malen 1-2 ms. Aber wenn ich die Größe auf 4k verändere, wird es furchtbar träge (16 ms Malen). Gibt es eine Möglichkeit, die gleiche Funktionalität bei geringerem Ressourcenverbrauch zu implementieren?
Wenn ich die übergeordnete Klasse in QOpenGLWidget ändere, wird der QPainter theoretisch mit Hardwarebeschleunigung ausgeführt. Dabei läuft es aber noch langsamer.