#include "MaterialBox.h" // 构造函数 MaterialBox::MaterialBox(int flag, QWidget *parent) : QWidget(parent) { // 初始化料盒数据 boxes = { Material_box("Box 1", Idle), Material_box("Box 2", Occupied), Material_box("Box 3", Warning), Material_box("Box 4", Idle), Material_box("Box 5", Occupied), Material_box("Box 6", Warning) }; // 根据不同窗口设置不同大小 0:小 1:中 2:大 // if (flag == 0) { // boxWidth = 30; // 每个料盒的宽度 // boxHeight = 18; // 每个料盒的高度 // gap = 10; // 料盒之间的间距 // } else if (flag == 1) { // boxWidth = 50; // 每个料盒的宽度 // boxHeight = 18; // 每个料盒的高度 // gap = 10; // } else if (flag == 2) { // boxWidth = 30; // 每个料盒的宽度 // boxHeight = 18; // 每个料盒的高度 // gap = 10; // } } // 绘制事件 void MaterialBox::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 设置背景颜色 painter.fillRect(this->rect(), Qt::white); // 网格参数 int boxWidth = 30; // 每个料盒的宽度 int boxHeight = 18; // 每个料盒的高度 int gap = 10; // 料盒之间的间距 int cols = 3; // 每行的列数 // 计算料盒的总宽度和总高度 int totalWidth = cols * boxWidth + (cols - 1) * gap; int rows = (boxes.size() + cols - 1) / cols; // 计算总行数 int totalHeight = rows * boxHeight + (rows - 1) * gap; // 计算料盒的起始位置(居中显示) int startX = (width() - totalWidth) / 2; int startY = (height() - totalHeight) / 2; // 绘制所有料盒 for (size_t i = 0; i < boxes.size(); ++i) { int row = i / cols; // 当前料盒所在的行 int col = i % cols; // 当前料盒所在的列 int x = startX + col * (boxWidth + gap); int y = startY + row * (boxHeight + gap); // 绘制料盒外框 QRect boxRect(x, y, boxWidth, boxHeight); painter.setPen(Qt::black); painter.drawRect(boxRect); // 根据状态设置填充颜色 switch (boxes[i].status) { case Idle: painter.setBrush(Qt::green); // 空闲状态:绿色 break; case Occupied: painter.setBrush(Qt::blue); // 已占用状态:蓝色 break; case Warning: painter.setBrush(Qt::red); // 警告状态:红色 break; } painter.fillRect(boxRect, painter.brush()); // 在料盒中绘制名称 painter.setPen(Qt::white); // 设置文字颜色为白色 painter.drawText(boxRect, Qt::AlignCenter, boxes[i].name); } } // 鼠标点击事件 // void MaterialBox::mousePressEvent(QMouseEvent *event) { // int boxWidth = 30; // 每个料盒的宽度 // int boxHeight = 18; // 每个料盒的高度 // int gap = 10; // 料盒之间的间距 // int cols = 3; // 每行的列数 // // 计算料盒的起始位置(居中显示) // int totalWidth = cols * boxWidth + (cols - 1) * gap; // int startX = (width() - totalWidth) / 2; // int startY = 50; // // 遍历所有料盒,检查是否被点击 // for (size_t i = 0; i < boxes.size(); ++i) { // int row = i / cols; // int col = i % cols; // int x = startX + col * (boxWidth + gap); // int y = startY + row * (boxHeight + gap); // QRect boxRect(x, y, boxWidth, boxHeight); // if (boxRect.contains(event->pos())) { // // 打印被点击料盒的信息 // qDebug() << "Clicked on:" << boxes[i].name; // return; // } // } // }