效果图
代码如下
#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);
}