OCC鼠标控制

OCC鼠标控制

.h文件

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = nullptr);
    ~QtWidgetsApplication1();
protected:
	void paintEvent(QPaintEvent *event) override;
	QPaintEngine *paintEngine() const;

	//增加三维场景转换模式
	enum Action3d
	{
		Action3d_Nothing,
		Action3d_Panning,//平移
		Action3d_Zooming,//缩放
		Action3d_Rotation//旋转
	};

	void mousePressEvent(QMouseEvent *event) override;
	void mouseReleaseEvent(QMouseEvent *event) override;
	void mouseMoveEvent(QMouseEvent *event) override;
	void wheelEvent(QWheelEvent *event) override;

private:
    Ui::QtWidgetsApplication1Class ui;
	Handle(V3d_Viewer) viewer;
	Handle(V3d_View) view;
	Handle(AIS_InteractiveContext) context;
	Handle(WNT_Window) window;

	Standard_Integer m_x;//记录鼠标平移坐标X
	Standard_Integer m_y;//记录鼠标平移坐标y
	Action3d m_mode;//平移、缩放、旋转
};

.cpp文件

void QtWidgetsApplication1::mousePressEvent(QMouseEvent * event)
{
	//平移 鼠标右键+shift
	if ((event->buttons()&Qt::RightButton) && (QApplication::keyboardModifiers() == Qt::ShiftModifier))
	{
		m_mode = Action3d_Panning;
		m_x = event->pos().x();
		m_y = event->pos().y();
	}
	else if (event->buttons() & Qt::MidButton)//旋转
	{
		m_mode = Action3d_Rotation;
		//开始旋转视图围绕屏幕轴
		view->StartRotation(event->pos().x(), event->pos().y());
	}
}
void QtWidgetsApplication1::mouseReleaseEvent(QMouseEvent * event)
{
	m_mode = Action3d_Nothing;
}

void QtWidgetsApplication1::mouseMoveEvent(QMouseEvent * event)
{
	switch (m_mode)
	{
	case QtWidgetsApplication1::Action3d_Panning:
		view->Pan(event->pos().x() - m_x, m_y - event->pos().y());
		m_x = event->pos().x();
		m_y = event->pos().y();
		break;
	case QtWidgetsApplication1::Action3d_Rotation:
		view->Rotation(event->pos().x(), event->pos().y());
		break;
	default:
		break;
	}
}
//缩放
//Zoom方法通过相邻两侧鼠标位置来判断缩小或者放大,以及缩放程度。鼠标滚轮event->angleDelta().y()会返回数值,以此模拟第二次鼠标位置
void QtWidgetsApplication1::wheelEvent(QWheelEvent * event)
{
	//view->Zoom(0, 0, event->angleDelta().y(), 0);//固定点缩放
	//跟随鼠标位置进行缩放
	view->StartZoomAtPoint(event->pos().x(), event->pos().y());
	view->ZoomAtPoint(0, 0, event->angleDelta().y(), 0);

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序源码下载

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步、步、为营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值