Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 圈用户头像问题_C++_Qt_Windows Applications - Fatal编程技术网

C++ 圈用户头像问题

C++ 圈用户头像问题,c++,qt,windows-applications,C++,Qt,Windows Applications,我想用图像圈制作QLabel: 代码: QLabel *label = new QLabel(this); QPixmap avatarPixmap(":/Icon/default_avatar.png"); label->setPixmap(avatarPixmap); label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;"); void Accou

我想用图像圈制作
QLabel

代码:

QLabel *label = new QLabel(this);
QPixmap avatarPixmap(":/Icon/default_avatar.png");
label->setPixmap(avatarPixmap);
label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;");
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/default_avatar.png");
    QBrush brush(pixmap);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/my_avatar.png");
    QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
    QBrush brush(scaled);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}

它只环绕
QLabel
,而不是图像。如何修复它?谢谢

更新:

QLabel *label = new QLabel(this);
QPixmap avatarPixmap(":/Icon/default_avatar.png");
label->setPixmap(avatarPixmap);
label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;");
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/default_avatar.png");
    QBrush brush(pixmap);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/my_avatar.png");
    QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
    QBrush brush(scaled);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
唯一的方法是覆盖
QLabel的
paintEvent

代码:

QLabel *label = new QLabel(this);
QPixmap avatarPixmap(":/Icon/default_avatar.png");
label->setPixmap(avatarPixmap);
label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;");
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/default_avatar.png");
    QBrush brush(pixmap);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/my_avatar.png");
    QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
    QBrush brush(scaled);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}


图像是圆形的,但未正确缩放。有什么想法吗?

尝试在标签上设置遮罩,如:

int w = // set the width here
int h = // set the height here
QRect *rct = new QRect(0, 0, w, h);
QRegion *reg = new QRegion(*rct, QRegion::Ellipse);
label->setMask(*reg);

请参阅:

通过重写
QLabel
paintEvent
方法来获取解决方案

代码:

QLabel *label = new QLabel(this);
QPixmap avatarPixmap(":/Icon/default_avatar.png");
label->setPixmap(avatarPixmap);
label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;");
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/default_avatar.png");
    QBrush brush(pixmap);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/my_avatar.png");
    QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
    QBrush brush(scaled);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
结果:

QLabel *label = new QLabel(this);
QPixmap avatarPixmap(":/Icon/default_avatar.png");
label->setPixmap(avatarPixmap);
label->setStyleSheet("border: 0.5px solid red; border-radius: 50%; background-clip: padding;");
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/default_avatar.png");
    QBrush brush(pixmap);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}
void AccountImage::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(":/Icon/my_avatar.png");
    QPixmap scaled = pixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
    QBrush brush(scaled);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawRoundedRect(0, 0, width(), height(), 100, 100);
    QLabel::paintEvent(event);
}

@lilistence修改图像是什么意思?@lilistence将边框图像应用于
QLabel
在我的情况下不起作用,我需要稍后通过代码更改默认图像。有没有办法重新绘制
QLabel
?@lilistence我已经覆盖了
QLabel
paintEvent
。我将在我的主要帖子中添加这些更改。看起来不错,但图像边缘很锐利。关于Pixmap,您可以尝试使用QPixmap::transformed()和Qt::SmoothTransformation->这将为您提供一个可用于标签的Pixmap转换副本。但我不确定这是否修复了边界本身。也许你也可以尝试边界风格:开始。如果这不起作用,也许你可以定义你自己的小部件,覆盖paintEvent,并通过使用抗锯齿来绘制内容本身。我试试看。谢谢。是的,我已经通过覆盖
QLabel paintEvent
正确设置了它。我将在这里发布代码,这样用户可以更快地找到解决方案。