#include "WindowAppBlockParallel.h" #include "WindowAppItemInterface.h" WindowAppBlockParallel::WindowAppBlockParallel(TOOL* pNewTool, POU* Pou, bool bShowOnly, QGraphicsObject* parent /*= nullptr*/) : WindowAppBlockStandardBase(pNewTool, Pou, bShowOnly, parent) , m_ParallelLineItem(nullptr) { //// 允许发送尺寸变更通知 //setFlag(QGraphicsItem::ItemSendsGeometryChanges); // 响应鼠标悬停事件(重要,否则QGraphicsItem默认是不响应鼠标悬停事件的) this->setAcceptHoverEvents(true); // 更新矩形区域的尺寸 this->updateRect(); } WindowAppBlockParallel::~WindowAppBlockParallel() { } /// /// 添加接口(Parallel工具需要额外添加ToolInterface接口) /// void WindowAppBlockParallel::addItemInterfaces() { // 添加标准接口 WindowAppBlockStandardBase::addItemInterfaces(); // 添加Tool接口 WindowAppBlockStandardBase::addItemToolInterfaces(); // 2022-8-23,首次添加时需要直接更新并行母线的位置,否则ToolEnd接口会按照默认形式显示 this->updateParallelLine(); } /// /// 更新并行母线的位置 /// void WindowAppBlockParallel::updateParallelLine() { if (m_itemInterfaces.size() > 0) { m_itemInterfaces[PARALL_END_INF_INDX]->updatePostion(); } } /// /// 绘制并行控件 /// /// /// /// void WindowAppBlockParallel::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { // WindowAppBlockStandardBase::paint(painter, option, widget); Q_UNUSED(option); Q_UNUSED(widget); painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); // 绘制边框 this->drawFrame(painter); // 绘制功能块名字 WindowAppBlockStandardBase::DrawBlockTitle(painter, true); // 绘制索引号 WindowAppBlockStandardBase::DrawIndex(painter); painter->restore(); } /// /// 功能块有变动时 /// /// /// /// QVariant WindowAppBlockParallel::itemChange(GraphicsItemChange change, const QVariant& value) { // 首先调用基类的函数 WindowAppBlockBase::itemChange(change, value); // 移动完毕之后,更新并行母线的位置 if (change == QGraphicsItem::ItemPositionHasChanged && scene()) { this->updateParallelLine(); } return QGraphicsItem::itemChange(change, value); } /// /// 绘制边框 /// /// void WindowAppBlockParallel::drawFrame(QPainter* painter) { // 设置画笔 if (!this->isSelected()) { painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME)); } else { painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME_BOLD)); } // 填充 painter->setBrush(COLOR_TBD_BG); // 绘制边框 painter->drawRoundedRect(blockRect, 0, 0); } /// /// 更新矩形区域的尺寸 /// void WindowAppBlockParallel::updateRect() { // 计算高度 int blockHeight = PARA_BASIC_HEIGHT; // 计算宽度 int blockWidth = PARA_BASIC_WIDTH; // 主体矩形区域 blockRect.setRect( -blockWidth / 2, -blockHeight / 2, blockWidth, blockHeight ); // 序号矩形区域 blockIndexRect.setRect( blockRect.right() - TBD_INDEX_WIDTH, blockRect.top() - TBD_INDEX_HEIGHT / 2, TBD_INDEX_WIDTH, TBD_INDEX_HEIGHT ); // 总体矩形边界 blockBoundingRect.setRect( blockRect.left(), blockRect.top() - TBD_INDEX_HEIGHT / 2, blockRect.width() + TBD_SHADOW_COUNT * PEN_LINE_WIDTH, blockRect.height() + TBD_INDEX_HEIGHT / 2 + TBD_SHADOW_COUNT * PEN_LINE_WIDTH ); }