I'm subClassing QLabel and painting a QPixmap via QPainter, it works fine, the problem is I can't change the image path of the pixmap and re-call the paintEvent function so it repaints the pixmap with the new Image.
I added a label from Qt Designer (i.e drag and drop) then promoted it to this subclass.
useravatar.h:
#ifndef USERAVATAR_H
#define USERAVATAR_H
#include <QLabel>
#include <QObject>
#include <QPen>
#include <QBrush>
#include <QPainter>
#include <QPaintEvent>
class userAvatar : public QLabel
{
Q_OBJECT
public:
QString photoLocation;
userAvatar(QWidget *parent);
void setPath(const QString &path);
private:
void paintEvent(QPaintEvent *event) override;
};
#endif // USERAVATAR_H
useravatar.cpp:
#include "useravatar.h"
#include <unistd.h>
userAvatar::userAvatar(QWidget *parent) : QLabel(parent)
{
}
void userAvatar::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
QPixmap pixmap(photoLocation);
qDebug() << photoLocation; // outputs EMPTY string
QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
QBrush bruch(scaled);
bruch.setColor(Qt::black);
painter.setBrush(bruch);
painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
}
void userAvatar::setPath(const QString &path)
{
photoLocation = path;
update();
}
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include "useravatar.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
userAvatar *avatar = new userAvatar(nullptr);
avatar->setPath("E:/NetWork__Installs/kitty meme.jpg");
}
Widget::~Widget()
{
delete ui;
}
I get this error from painEvent:
QPixmap::scaled: Pixmap is a null pixmap
This does not get added to the ui, it won't be visible, its
paintEventwon't be called, meaning the error you get is not from this object.The
userAvatarthat does emit that error is instantiated inui_widget.hand visible.To set
photoLocationof theuserAvatarin your ui, use this:yourUserAvataris whatever you named youruserAvatarin Qt Designer.