#include "WindowAppRefLineManager.h" #include "WindowAppUiScene.h" WindowAppRefLineManager::WindowAppRefLineManager() : m_pScene(nullptr) { } /// /// 根据两个Widget控件的关系,处理对应的参考线效果 /// /// /// void WindowAppRefLineManager::check(QWidget* srcWidget, QWidget* dstWidget) { //qDebug() << "WindowAppRefLineManager::check - srcRect[" << srcWidget->geometry() << "], dsrRect[" << dstWidget->geometry() << "]"; // 遍历控件的所有边(4个)进行匹配, (两个控件之间可能会有最多2条参考线) for (int i = 0; i < (int)SIDE_DIRECTION::SIDE_COUNT; i++) { // 起点线 QLine srcLine = Utility::getSideLineByID(srcWidget, i); for (int j = 0; j < (int)SIDE_DIRECTION::SIDE_COUNT; j++) { // 终点线 QLine dstLine = Utility::getSideLineByID(dstWidget, j); // 构造参考线信息 UI_REFLINE_INFO lineInfo(srcWidget, dstWidget, SIDE_DIRECTION(i), SIDE_DIRECTION(j)); // 如果两条线是对齐的(延长线) if (Utility::isAligned(srcLine, dstLine)) { // qDebug() << "WindowAppRefLineManager::check aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "]."; // 此处应有线(如果有就更新,没有就新建一条) this->updateRefLine(lineInfo); // 由于两个控件之间可能会有多条线,所以需要继续循环 } // 如果这两条线已经不对齐了,则需要搜索一下对应的参考线是否存在,如果存在则删除 else { // qDebug() << "WindowAppRefLineManager::check not aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "]."; this->removeRefLine(lineInfo); } } } } /// /// 无条件清空所有的参考线 /// void WindowAppRefLineManager::clear() { QVector::iterator itr = m_RefLines.begin(); for (; itr != m_RefLines.end();) { // 清空当前参考线 m_pScene->removeItem(*itr); itr = m_RefLines.erase(itr); } this->m_RefLines.clear(); } /// /// 更新参考线(是否新建、位置、长度等) /// /// /// /// /// void WindowAppRefLineManager::updateRefLine(const UI_REFLINE_INFO& info) { // 首先查找是否有这条线存在,则更新 if (isRefLineExist(info)) { // 则更新这条线(似乎不需要额外处理,系统会自动刷新位置和长度) // qDebug() << "WindowAppRefLineManager::updateRefLine"; } // 如果这条线目前不存在,则新建 else { // qDebug() << "WindowAppRefLineManager::updateRefLine - newLine - " << (int)info.srcSide <<"," << (int)info.dstSide; // 根据对齐参数新建参考线 WindowAppItemRefLine* newLine = new WindowAppItemRefLine(info); // 添加到Scene m_pScene->addItem(newLine); // 加入到参考线组 m_RefLines.push_back(newLine); } } /// /// 查找对应的参考线是否存在 /// /// /// bool WindowAppRefLineManager::isRefLineExist(const UI_REFLINE_INFO& info) { QVector::iterator itr = m_RefLines.begin(); for (; itr != m_RefLines.end();) { if ((*itr)->m_refLineInfo == info) { return true; } else { itr++; } } return false; } /// /// 移除一条对应的参考线 /// /// void WindowAppRefLineManager::removeRefLine(const UI_REFLINE_INFO& info) { QVector::iterator itr = m_RefLines.begin(); for (; itr != m_RefLines.end();) { if ((*itr)->m_refLineInfo == info) { // qDebug() << "WindowAppRefLineManager::check not aligned "; // Scene中移除这个Line m_pScene->removeItem(*itr); itr = m_RefLines.erase(itr); break; } else { itr++; } } } //=========================================================================================== // // 辅助函数 // //===========================================================================================