鼠标位移item的pos
			 2024-12-18
			  18
			 0
			
			
			
				
			
			
		
			鼠标位移由OBSBasicPreview::mouseMoveEvent触发。
1.首选通过GetMouseEventPos计算出鼠标的位置在实际画布窗口中的相对位置。
返回的这个位置pos就变成了相对于画布绘图区域的逻辑位置了。
2.获取到POS调用MoveItems
void OBSBasicPreview::MoveItems(const vec2 &pos)
{
    Qt::KeyboardModifiers modifiers = QGuiApplication::keyboardModifiers();
    OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
    OBSScene scene = main->GetCurrentScene();
    vec2 offset, moveOffset;
    //与前位置与鼠标按下时的起始位置之差
    vec2_sub(&offset, &pos, &startPos);
    vec2_sub(&moveOffset, &offset, &lastMoveOffset);
    if (!(modifiers & Qt::ControlModifier))
        SnapItemMovement(moveOffset);
    vec2_add(&lastMoveOffset, &lastMoveOffset, &moveOffset);
    obs_scene_enum_items(scene, move_items, &moveOffset);
}
最终调用move_items
static bool move_items(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
//获取偏移位置
    vec2 *offset = reinterpret_cast<vec2 *>(param);
    if (selected) {
        vec2 pos;
        //获取当前
        obs_sceneitem_get_pos(item, &pos);
        //计算新的位置
        vec2_add(&pos, &pos, offset);
        //更新位置
        obs_sceneitem_set_pos(item, &pos);
    }
}
所以这里的偏移使用的是方法:
1.鼠标按下时计录按下的位置
2.鼠标移动时的位置和刚开始按下的位置做差,就计算出了移动的位置。这样ITEM的源坐标加上这个偏多位置就是新的位置。
注意,这里的位置都是相对于画布绘图区域的逻辑坐标位置。
逻辑坐标的计算
位意一鼠标点相对于画布的逻辑坐位计算方法使用GetMouseEventPos来计算。
vec2 OBSBasicPreview::GetMouseEventPos(QMouseEvent *event)
{
    OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
    float pixelRatio = main->devicePixelRatioF();
    float scale = pixelRatio / main->previewScale;
    vec2 pos;
    vec2_set(&pos,
         (float(event->x()) - main->previewX / pixelRatio) * scale,
         (float(event->y()) - main->previewY / pixelRatio) * scale);
    return pos;
}
 obs-item-pos-transform
			obs-item-pos-transform
			




