QGraphicsView不执行鼠标松开事件C++
时间: 2023-09-15 18:15:22 浏览: 108
可能是因为QGraphicsView默认情况下会将鼠标事件交给其子控件处理,而不是自己处理。你可以尝试在重载QGraphicsView的mouseReleaseEvent函数时,调用父类的mouseReleaseEvent函数,以确保鼠标松开事件被正确处理。例如:
```cpp
void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
// 处理自己的逻辑...
// 调用父类的mouseReleaseEvent函数
QGraphicsView::mouseReleaseEvent(event);
}
```
另外,如果你希望QGraphicsView自己处理鼠标事件而不是交给其子控件处理,可以调用setMouseTracking(true)函数,以确保鼠标事件被正确传递。例如:
```cpp
MyGraphicsView::MyGraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
setMouseTracking(true); // 开启鼠标追踪
}
```
相关问题
先执行QGraphicsItem鼠标松开事件接着执行QGraphicsView鼠标松开事件 C++
在Qt中,QGraphicsView继承自QWidget,而QGraphicsItem继承自QGraphicsObject。因此,当在QGraphicsView中鼠标松开时,会首先调用QGraphicsView的mouseReleaseEvent(),然后再调用QGraphicsScene的mouseReleaseEvent(),最后才调用QGraphicsItem的mouseReleaseEvent()。
如果你想先执行QGraphicsItem的鼠标松开事件,可以使用eventFilter()函数来拦截QGraphicsView的鼠标松开事件,并在其中调用QGraphicsItem的mouseReleaseEvent()。以下是一个示例:
```cpp
bool MyGraphicsItem::eventFilter(QObject* obj, QEvent* event)
{
if(event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
if(mouseEvent->button() == Qt::LeftButton)
{
mouseReleaseEvent(mouseEvent);
return true;
}
}
return QObject::eventFilter(obj, event);
}
void MyGraphicsView::mouseReleaseEvent(QMouseEvent* event)
{
QGraphicsView::mouseReleaseEvent(event);
}
void MyGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
QGraphicsScene::mouseReleaseEvent(event);
}
void MyGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
// 处理鼠标松开事件
}
```
在这个示例中,我们重写了QGraphicsItem的eventFilter()函数,在其中拦截QGraphicsView的鼠标松开事件,并调用QGraphicsItem的mouseReleaseEvent()函数处理事件。在QGraphicsView和QGraphicsScene中,我们只需要调用父类的mouseReleaseEvent()函数即可。
qgraphicsview绘制矩形并实现鼠标拖拽缩放
### 使用 `QGraphicsView` 绘制矩形并实现鼠标拖拽缩放
为了在 `QGraphicsView` 中绘制矩形并实现鼠标的拖拽和缩放功能,在 C++ 的 Qt 框架下可以按照如下方式构建应用程序。
#### 创建自定义的 `QGraphicsView`
首先创建一个继承于 `QGraphicsView` 的类,以便能够重载其事件处理函数从而响应用户的交互行为。这允许更精细地控制视图的行为,比如基于滚轮事件调整缩放级别或是捕捉鼠标点击与释放的位置来进行平移操作[^3]。
```cpp
class CustomGraphicsView : public QGraphicsView {
Q_OBJECT
public:
explicit CustomGraphicsView(QWidget *parent = nullptr);
protected:
void wheelEvent(QWheelEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
QPointF dragStartPos;
};
```
#### 初始化图形场景与项
接着初始化 `QGraphicsScene` 和要展示在其上的项目(这里是两个矩形)。这些对象会被添加到之前提到的自定义视图组件中去显示给用户看。
```cpp
CustomGraphicsView::CustomGraphicsView(QWidget *parent)
: QGraphicsView(parent), m_dOriScale(1.0){
setRenderHint(QPainter::Antialiasing); // 抗锯齿渲染
auto scene = new QGraphicsScene(this);
// 添加第一个矩形
QRectF rect1(-50, -25, 100, 50);
auto item1 = scene->addRect(rect1, QPen(Qt::black));
// 添加第二个矩形
QRectF rect2(75, 75, 100, 50);
auto item2 = scene->addRect(rect2, QPen(Qt::red));
this->setScene(scene);
}
```
#### 处理鼠标事件以支持拖拽和平移
对于拖拽和平移的支持可以通过覆盖相应的鼠标事件处理器来完成。这里记录按下时的位置,并利用它计算出移动的距离应用于整个视图之上。
```cpp
void CustomGraphicsView::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
dragStartPos = event->pos();
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsView::mousePressEvent(event);
}
}
void CustomGraphicsView::mouseMoveEvent(QMouseEvent *event){
if(dragMode() != QGraphicsView::NoDrag && (event->buttons() & Qt::LeftButton)){
centerOn(mapToScene(event->pos()));
}else{
QGraphicsView::mouseMoveEvent(event);
}
}
void CustomGraphicsView::mouseReleaseEvent(QMouseEvent *event){
unsetCursor(); // 鼠标松开后恢复默认样式
QGraphicsView::mouseReleaseEvent(event);
}
```
#### 实现缩放逻辑
最后一步就是加入对滚动条或手势触发的缩放示意。此部分同样依赖于覆写的事件处理器——具体来说是 `wheelEvent()` 方法。每当接收到滚轮输入的时候就相应地增大/减小当前的比例因子;同时保持中心不变使得放大缩小围绕着焦点发生[^4]。
```cpp
void CustomGraphicsView::wheelEvent(QWheelEvent *event){
const qreal scaleFactor = 1.15; // 放大倍数
if(event->delta()>0){ // 向前滚动表示放大
scale(scaleFactor,scaleFactor);
}else{ // 向后滚动则缩小
scale(1/scaleFactor,1/scaleFactor);
}
// 更新原比例变量m_dOriScale
m_dOriScale *= qAbs((event->delta()>0)?scaleFactor:(1/scaleFactor));
// 设置新的变换矩阵使缩放在固定点处生效
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
```
上述代码片段提供了一个完整的解决方案,涵盖了从基本界面搭建直到高级特性集成的过程。通过这种方式可以在 Qt 应用程序里轻松实现在 `QGraphicsView` 上面画矩形并且让它们具备良好的互动体验[^1][^2].
阅读全文
相关推荐







