qt随机生成SVG图片

效果图

代码如下

#include <QSvgRenderer>
QString randomColor() {
    QRandomGenerator *generator = QRandomGenerator::global();
    return QString("rgb(%1, %2, %3)")
        .arg(generator->bounded(256))
        .arg(generator->bounded(256))
        .arg(generator->bounded(256));
}

// 生成随机SVG内容的函数
QString generateRandomSvg(int width, int height) {
    QRandomGenerator *generator = QRandomGenerator::global();

    // 随机选择形状类型
    int shapeType = generator->bounded(3);

    QString svgContent;
    svgContent += QString("<svg width=\"%1\" height=\"%2\" xmlns=\"http://www.w3.org/2000/svg\">")
                      .arg(width).arg(height);

    // 随机背景
    svgContent += QString("<rect width=\"100%\" height=\"100%\" fill=\"%1\" />")
                      .arg(randomColor());

    // 随机生成3-10个形状
    int shapeCount = generator->bounded(7) + 3;
    for (int i = 0; i < shapeCount; ++i) {
        int x = generator->bounded(width);
        int y = generator->bounded(height);
        int size = generator->bounded(50) + 20;

        if (shapeType == 0) {
            // 圆形
            svgContent += QString("<circle cx=\"%1\" cy=\"%2\" r=\"%3\" fill=\"%4\" opacity=\"0.7\" />")
                              .arg(x).arg(y).arg(size/2).arg(randomColor());
        } else if (shapeType == 1) {
            // 矩形
            svgContent += QString("<rect x=\"%1\" y=\"%2\" width=\"%3\" height=\"%4\" fill=\"%5\" opacity=\"0.7\" />")
                              .arg(x).arg(y).arg(size).arg(size).arg(randomColor());
        } else {
            // 多边形
            svgContent += QString("<polygon points=\"%1,%2 %3,%4 %5,%6\" fill=\"%7\" opacity=\"0.7\" />")
                              .arg(x).arg(y)
                              .arg(x + size).arg(y)
                              .arg(x + size/2).arg(y + size)
                              .arg(randomColor());
        }
    }

    svgContent += "</svg>";
    return svgContent;
}
/**
 * @brief 将多个QLabel添加到QGridLayout中,每行最多4个,均匀分布
 * @param gridLayout 目标布局
 * @param labels 要添加的QLabel列表
 * @param parent 父窗口指针(用于设置QLabel的父对象)
 */

typedef QList<QLabel*> QLabelList;
void addItemsToGridLayout(QGridLayout* gridLayout,
                          const QLabelList& labels,
                          QWidget* parent = nullptr)
{
    if (!gridLayout) return;

    // 清空布局中所有现有项
    QLayoutItem* item;
    while ((item = gridLayout->takeAt(0)) != nullptr) {
        delete item->widget();
        delete item;
    }

    const int maxColumns = 9; // 每行最多4个控件
    int row = 0;
    int column = 0;

    for (QLabel* label : labels) {
        if (parent && !label->parent()) {
            label->setParent(parent);
        }

        // 添加到布局
        gridLayout->addWidget(label, row, column);

        // 更新行列位置
        column++;
        if (column >= maxColumns) {
            column = 0;
            row++;
        }
    }

    // 设置均匀分布
    // 1. 设置所有列有相同的宽度
    for (int i = 0; i < maxColumns; ++i) {
        gridLayout->setColumnStretch(i, 1);
    }

    // 2. 设置所有行有相同的高度
    int rowCount = (labels.size() + maxColumns - 1) / maxColumns; // 计算行数
    for (int i = 0; i < rowCount; ++i) {
        gridLayout->setRowStretch(i, 1);
    }
}

void testGeneralSvgLabels(QWidget * centerWidget){


    auto layout = new QGridLayout(centerWidget);

    const QSize IconSize = QSize(80,80);
    QLabelList list;
    for(int index = 0; index<40; index++){
        QLabel * label = new QLabel(centerWidget);
        label->resize(IconSize);
        QString svgContent = generateRandomSvg(label->width(), label->height());

        // 创建SVG渲染器
        QSvgRenderer renderer(svgContent.toUtf8());

        // 创建与标签大小相同的QPixmap
        QPixmap pixmap(label->size());
        pixmap.fill(Qt::transparent);

        // 在QPixmap上绘制SVG
        QPainter painter(&pixmap);
        renderer.render(&painter);
        painter.end();

        // 设置标签的背景图片
        label->setPixmap(pixmap);

        list.append(label);
    }
    addItemsToGridLayout(layout,list);

}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QWidget * centerWidget = new QWidget(this);
    testGeneralSvgLabels(centerWidget);
    this->setCentralWidget(centerWidget);
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容