qopenglwidget实现2d拖动,并设置归位键,给出c++示例
时间: 2024-03-16 14:46:03 浏览: 52
以下是一个简单的 QOpenGLWidget 示例,可以实现在平面上的 2D 拖动,并提供一个归位按钮,点击后可以将视图还原到初始状态:
```cpp
class MyOpenGLWidget : public QOpenGLWidget
{
public:
MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent), m_dragging(false)
{
// 初始化模型矩阵
m_modelMatrix.setToIdentity();
}
protected:
void initializeGL() override
{
// 初始化 OpenGL
initializeOpenGLFunctions();
// 设置背景颜色
glClearColor(1, 1, 1, 1);
}
void resizeGL(int w, int h) override
{
// 设置视口
glViewport(0, 0, w, h);
}
void paintGL() override
{
// 清除缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 绘制一个矩形
glBegin(GL_QUADS);
glColor3f(1, 0, 0); glVertex2f(-0.5, -0.5);
glColor3f(0, 1, 0); glVertex2f(-0.5, 0.5);
glColor3f(0, 0, 1); glVertex2f(0.5, 0.5);
glColor3f(1, 1, 0); glVertex2f(0.5, -0.5);
glEnd();
}
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_dragging = true;
m_lastPos = event->pos();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (m_dragging) {
int dx = event->pos().x() - m_lastPos.x();
int dy = event->pos().y() - m_lastPos.y();
m_lastPos = event->pos();
// 水平和垂直方向都可以移动
m_modelMatrix.translate(dx / width(), -dy / height(), 0);
update();
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_dragging = false;
}
}
private:
bool m_dragging; // 是否正在拖动
QPoint m_lastPos; // 上一个鼠标位置
QMatrix4x4 m_modelMatrix; // 模型矩阵
};
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建 OpenGL 视图
m_glWidget = new MyOpenGLWidget(this);
m_glWidget->setFixedSize(400, 400);
// 创建归位按钮
m_resetButton = new QPushButton(tr("Reset"), this);
m_resetButton->setGeometry(10, 10, 80, 30);
// 绑定归位按钮的点击事件
connect(m_resetButton, &QPushButton::clicked, this, [this]() {
m_glWidget->resetView();
});
}
private:
MyOpenGLWidget *m_glWidget; // OpenGL 视图
QPushButton *m_resetButton; // 归位按钮
};
```
其中,resetView() 函数可以通过重置模型矩阵来还原视图:
```cpp
void MyOpenGLWidget::resetView()
{
m_modelMatrix.setToIdentity();
update();
}
```
注意,这只是一个简单的示例,实际应用中可能需要根据具体的需求来做更多的处理。
阅读全文