wordpress的结构,哈尔滨seo搜索优化,手机笑话网站源码,网站建设 中企动力  东莞前提 在开发一个类似qdesiger的项目中 使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑 创建自定义类继承QGraphicsProxyWidget#xff0c;管理控件 成员变量 有控件的xywh等#xff0c;其中x、y坐标存储是基于最底层widgetitem的 坐标系 x轴以右为正…前提 在开发一个类似qdesiger的项目中 使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑 创建自定义类继承QGraphicsProxyWidget管理控件 成员变量 有控件的xywh等其中x、y坐标存储是基于最底层widgetitem的 坐标系 x轴以右为正方向y轴以下为正方向 首先鼠标悬浮在控件八个方位范围内时显示对应的鼠标指针样式 
1.mousePress事件存储初始鼠标坐标 
void ProxyClass::mousePressEvent(QGraphicsSceneMouseEvent *event)QPointF pos  event-pos();//Returns the mouse cursor position in item coordinates.
_pressPos pos;2.mouseMove事件 
void ProxyClass::mouseMoveEvent(QGraphicsSceneMouseEvent *event)检测到当前状态时调整尺寸而不是移动控件时获取移动实时的鼠标坐标然后与初始鼠标坐标相减得出鼠标总的移动的坐标范围值  QPointF currentPos  event-pos();QPointF movePoint  currentPos - _pressPos;//移动区域  h↓ y↑其实鼠标拖拽右、下边框比较简单只涉及到修改控件尺寸但是关于左、上边框不仅涉及到修改控件尺寸还涉及到控件坐标值的修改需要注意一下。 
右下例 case E_Right:{qreal w  event-pos().x();if (w  getItemMinSize().width())setItemWidth(w);}break;case E_Bottom:{qreal h  event-pos().y();if (h  getItemMinSize().height())setItemHeight(h);}break; 
左、上例 得到控件高度的变化值 moveSize.y()与原高度相减得出此时修改后的高度值也就是调整后的控件高度值 与此同时控件的y坐标也要发生改变原y坐标高度变化值 defaultWidgetY()  dy, 因为坐标系y向下为正方向鼠标拖动上边框往下时差值为正但是高度是应该减小的所以此时 h是原高度-移动高度值 case E_Top:{int h  getItemHeight() - moveSize.y();const int dy  moveSize.y();trySetGeometry(defaultWidgetX(), defaultWidgetY()  dy, getItemWidth(), h);}break;case E_Left:{int w  getItemWidth() - moveSize.x();const int dx  moveSize.x();trySetGeometry(defaultWidgetX()  dx, defaultWidgetY(), w, getItemHeight());}break;调用trySetGeometry函数具体设置控件的xywh setItemSize函数中默认有resize函数设置修改控件尺寸 设置修改控件坐标时注意坐标系的转换setpospos的pos是基于父类图元的坐标 目前坐标 基于默认widgetItem —[mapToScene]转换成— 场景坐标 —[mapToParent]—相对该图元的父类图元坐标然后使用setpos设置修改调整后的控件坐标 注意修改后的宽高不要小于控件的最小宽高值 
void ProxyClass::trySetGeometry(int x, int y, int width, int height)
{int minw  this-minimumSize().width();//控件的最小宽高int minh  this-minimumSize().height();setItemSize(QSizeF(qMax(minw, width), qMax(minh, height)));//保存设置控件尺寸  修改后的宽高不要小于控件的最小宽高值setDefaultWidgetPos(QPointF(x,y));//保存调整后的坐标//坐标转换设置调整后坐标if(getRoScene()){auto sc  dynamic_castDesignerGraphicsScene*(getRoScene());auto scPos  sc-getDefaultWidgetItem()-mapToScene(QPointF(x,y));if(parentItem()){auto pPos  mapToParent(mapFromScene(scPos));setPos(pPos);}}
}3.鼠标释放后再调用修改右树属性值的函数达到视图中的控件属性状态与右树对应属性值的实时一致。