代码之家  ›  专栏  ›  技术社区  ›  Rick

如何向圆形qpixmap添加边框?

qt
  •  0
  • Rick  · 技术社区  · 6 年前

    我想展示一个圆形的阿凡达qpixmap,周围有白色边框。但是,我不知道如何添加边框…有可能吗?

    这是我必须绘制化身图像的功能。

    void AccountDropDownMenu::setAvatar(
            const QByteArray& bytes)
    {
        QPixmap new_avatar;
        new_avatar.loadFromData(bytes);
        new_avatar = new_avatar.scaledToHeight(40, Qt::SmoothTransformation);
    
    
        QBitmap map(new_avatar.size());
        map.fill(Qt::color0);
    
        QPainter painter(&map);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setBrush(Qt::color1);
        painter.setPen(QPen(Qt::white, 10));
        painter.drawRoundedRect(
                m_avatar_label->x(),
                m_avatar_label->y(),
                new_avatar.width(),
                new_avatar.height(),
                45,
                45);
    
        new_avatar.setMask(map);
    
        avatar_label->setPixmap(new_avatar);
    }
    

    更新

    多亏了dtech,我能够使用以下更新的函数获得所需的输出……虽然有点麻烦(边界)。

    void AccountDropDownMenu::setAvatar(
            const QByteArray& bytes)
    {
        QPixmap new_avatar;
        new_avatar.loadFromData(bytes);
        new_avatar = new_avatar.scaledToHeight(40, Qt::SmoothTransformation);
    
    
        QBitmap map(new_avatar.size());
        map.fill(Qt::color0);
    
        QPainter painter(&map);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setBrush(Qt::color1);
        painter.drawRoundedRect(
                    QRectF(
                        avatar_label->x(),
                        avatar_label->y(),
                        new_avatar.width(),
                        new_avatar.height()),
                    40,
                    40);
        new_avatar.setMask(map);
    
        QPainter painter2(&new_avatar);
        painter2.setRenderHint(QPainter::Antialiasing);
        painter2.setPen(QPen(Qt::white, 1));
        painter2.drawRoundedRect(
                    QRectF(
                        avatar_label->x(),
                        avatar_label->y(),
                        new_avatar.width(),
                        new_avatar.height()),
                    40,
                    40);
    
        avatar_label->setPixmap(new_avatar);
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   dtech    6 年前

    在qt中,您使用画笔绘制填充,但轮廓使用 QPen .

    我没用过 QPainter 很长一段时间,但是iirc,默认的钢笔是零宽度的,这可以解释为什么你没有得到任何东西-你没有设置钢笔。

    此外,您不需要“另一个”圆角矩形,您可以将填充和轮廓应用于同一几何图形, as demonstrated in this answer .

    更新:

    更新的代码设置了一个掩码,它设置了一个alpha通道。与你已经拥有的东西相去甚远,它不可能增加任何东西。你得在像素上画画。简单使用 new_avatar 作为油漆设备- QPainter painter(&new_avatar); 把剩下的扔掉。