自助建站最大宁波网络推广专员
自助建站最大,宁波网络推广专员,万户网络官网,钓鱼网站源码前提 在开发一个类似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.鼠标释放后再调用修改右树属性值的函数达到视图中的控件属性状态与右树对应属性值的实时一致。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87133.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!