#include "MaterialBox.h" // 构造函数 MaterialBox::MaterialBox(int flag, QWidget *parent) : QWidget(parent) { // 初始化料盒数据 boxes = { 2, // iCurrLayers 32, // iLayersTotal 100, // iTopLev 50, // iBottomLev {15.5, 20.3}, // 补全所有子成员 {1,0,1,1,0}, // ...后续成员保持相同 }; } // 绘制事件 void MaterialBox::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 设置背景颜色 painter.fillRect(this->rect(), Qt::white); } void MaterialBox::paintInitFrom(QWidget *parent) { // 主容器尺寸(占窗口80%) const int containerWidthdp = parent->width() * 0.25; const int containerHeightdp = parent->height() * 0.05; const int containerWidth = parent->width() * 0.5; const int containerHeight = parent->height() *0.9; globalPixmap = QPixmap(parent->width(), parent->height()); globalPixmap.fill(Qt::white); // 填充背景色为白色 // 创建 QPainter 以绘制到 QPixmap 上 QPainter painter(&globalPixmap); painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿 // 绘制灰色背景框 painter.setPen(Qt::black); painter.setBrush(Qt::lightGray); painter.drawRect(containerWidthdp, containerHeightdp, containerWidth, containerHeight); // 计算内部可用空间(留5像素边距) int innerWidth = containerWidth - 10; // 左右各5像素 int innerHeight = containerHeight - 10; // 上下各5像素 int innerX = containerWidthdp + containerWidth*0.1; int innerY = containerHeightdp + 5; // 根据层数自动计算间距和矩形高度 const int totalLayers = boxes.iLayersTotal; const float spacing = static_cast((static_cast(innerHeight -totalLayers)) /static_cast(totalLayers)); // 每个矩形之间的固定间距(像素) qDebug()<(innerWidth); if((0<=totalLayers)&&(totalLayers<=8)){ rectHeight = 2.5; }else if((9<=totalLayers)&&(totalLayers<=16)){ rectHeight = 1.5; }else{ rectHeight = 1; } // 逐层绘制状态矩形 for(int i = 0; i < totalLayers; ++i) { const QColor color = boxes.iStatas[i] ? QColor(40, 129, 5) : QColor(255, 0, 0); // 1=绿,0=红 const int yPos = innerY + i * (rectHeight + spacing); painter.setPen(Qt::NoPen); // 去掉边框 painter.setBrush(color); painter.drawRect(static_cast(innerX), static_cast(yPos), static_cast(rectWeight), static_cast(rectHeight)); } } QPixmap MaterialBox::getGlobalPixmap() const { return globalPixmap; } void MaterialBox::initFrom(QWidget *parent){ int ratio = parent->height()/100; // 主容器尺寸(占窗口80%) // qDebug()<width()<height(); const int containerWidthdp = parent->width() * 0.25; const int containerHeightdp = parent->height() * 0.05; const int containerWidth = parent->width() * 0.5; const int containerHeight = parent->height() *0.9; // 计算内部可用空间(留5像素边距) int innerWidth = containerWidth - 10*ratio; // 左右各5像素 int innerHeight = containerHeight - 10*ratio; // 上下各5像素 int innerX = containerWidthdp + containerWidth*0.1; int innerY = containerHeightdp + 5*ratio; // 根据层数自动计算间距和矩形高度 const int totalLayers = boxes.iLayersTotal; const float spacing = static_cast((static_cast(innerHeight -totalLayers*ratio)) /static_cast(totalLayers)); // 每个矩形之间的固定间距(像素) qDebug()<(innerWidth); if((0<=totalLayers)&&(totalLayers<=8)){ rectHeight = 2.5*ratio; }else if((9<=totalLayers)&&(totalLayers<=16)){ rectHeight = 1.5*ratio; }else{ rectHeight = 1*ratio; } BackgroundRect* backgroundRect = new BackgroundRect(containerWidthdp, containerHeightdp, containerWidth, containerHeight); scene = new QGraphicsScene(parent); view = new MaterialBoxGraphicsView(scene); scene->addItem(backgroundRect); for (int i = 0; i < totalLayers; ++i) { MaterialBoxDie* materialBoxDie = new MaterialBoxDie(i, 0, boxes.iStatas[i],rectWeight, rectHeight); materialBoxDie->setPos(innerX,(innerY+ i * (rectHeight + spacing) )); scene->addItem(materialBoxDie); } connect(view, &MaterialBoxGraphicsView::layerRightClicked, this, &MaterialBox::handleLayerRightClicked); view->resize(parent->width(), parent->height()); view->resetTransform(); view->setSceneRect(0, 0, parent->width(), parent->height()); } void MaterialBox::handleLayerRightClicked(int layer) { qDebug() << "Right-clicked on layer:" << layer; // 在这里可以添加其他处理逻辑,例如发送信号到其他对象 }