在使用QGraphicsView过程中,有时候我们需要对view进行缩放,但是对于一般正常的加入view中的item都会随着view的大小变化而变化,但是如果我们想让某些item不随view的缩放进行改变怎么办呢?
很简单,下面讲述两种方法供大家参考学习。
二、代码之路
首先讲述如何通过鼠标滚轮使view放大缩小。很简单,继承QGraphicsView类,然后重写wheelEvent()事件即可。
void MyGraphicsView::wheelEvent(QWheelEvent *event)
qreal scaleFactor = this->matrix().m11();
int wheelDeltaValue = event->delta();
if (wheelDeltaValue > 0)
this->scale(1.2, 1.2);
this->scale(1.0 / 1.2, 1.0 / 1.2);
QGraphicsItem* item = new QGraphicsItem;
item->setFlag(QGraphicsItem::ItemIgnoresTransformations);
Qt助手中setFlag()方法的介绍:
这里我们看一下需要使用到的ItemIgnoresTransformations参数的说明:
这里我们看到,如果给item设置了这个参数,那个这个item就会忽略通过继承从父类得到的transformations,这里的transformations具体包含三个部分rotation、 zoom、shear,这里将会忽略这三个参数的作用。
所以如果你只想忽略某一个,比如只忽略zoom(放大,缩小),其他的想保留,那么就要看一下方法二。
方法二:通过重写QGraphicsItem的paint()方法
其实我们需要知道,item的paint方法什么时候会调用,从哪里调用。我们可以跟踪一下源码,其实第一步是先进入到QGraphicsView的paintEvent事件中,然后在这里创建QPainter对象,并未painter设置当前的transformations(rotation、 zoom、shear),然后将painter对象传给scene对象,通过调用scene的drawItems方法,在drawItems方法中去绘制每一个item(通过调用item的paint方法),这个过程比较复杂,具体大家可以看一下源码。
通过重写QGraphicsItem的paint()方法,实现QGraphicsItem不随QGraphicsView放大缩小而改变大小。同理,这里也可以重新设置rotation或者shear。
void CustomItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
double scaleFactor = 1.0 / painter->matrix().m11();
painter->scale(scaleFactor, scaleFactor);
__super::paint(painter, option, widget);
void CustomItemTest::initView()
CustomItem* myItem = new CustomItem;
myItem->setLine(QLine(QPoint(200, 200), QPoint(300, 300)));
QPen pen;
pen.setColor(Qt::red);
myItem->setPen(pen);
QGraphicsLineItem* lineItem = new QGraphicsLineItem;
lineItem->setLine(QLine(QPoint(200, 300), QPoint(300, 400)));
pen.setColor(Qt::blue);
lineItem->setPen(pen);
QGraphicsRectItem* rectItem = new QGraphicsRectItem;
rectItem->setRect(QRect(QPoint(200, 400), QPoint(300, 500)));
CustomView* myView = new CustomView;
QGraphicsScene* scene = new QGraphicsScene;
scene->addItem(myItem);
scene->addItem(lineItem);
scene->addItem(rectItem);
myView->setScene(scene);
QHBoxLayout* myLayout = new QHBoxLayout(this);
myLayout->addWidget(myView);
我们看一下效果,下图中,红色线不会随着随QGraphicsView放大缩小而改变大小,而蓝色的线会随着view放大缩小而改变大小,不仅改变了线的长度还有线的宽度。
然后我们把测试代码中一行注释的代码解开注释,即我们上面讲到的方法一,看一下效果,两条线的宽度和长度都不会改变。
这里我举了线条的例子,像其他Item,比如QGraphicsRectItem、QGraphicsEllipseItem等都可以使用以上两种方法使其不随QGraphicsView放大缩小而改变大小。
但是如果像地图这种对于线条,只想保持线条的宽度不变,这个就必须使用方法二了,这里也需要做一些必要的修改了。
void CustomItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
double scaleFactor = painter->matrix().m11();
QPen myPen = this->pen();
myPen.setWidthF(myPen.widthF() / scaleFactor);
painter->setPen(myPen);
painter->drawLine(this->line());
我们看到红线的长度会随着view的缩放而变化,但是线宽却一直保持不变,可以对比下面的矩形,四条边的线宽会不断变化,而蓝色的线只设置了QGraphicsItem::ItemIgnoresTransformations,就一直保持不变。
还有一点需要注意的是,如果给画笔的线宽设置为0(见下方代码),那么在view缩放时,线宽就永远保持为1,不会变化,虽然也达到了一样的效果,但是不能设置线宽为其他值了,比如设置线宽为2、5等等。
QPen myPen = this->pen();
myPen.setWidth(0);
painter->setPen(myPen);
painter->drawLine(this->line());
如何使QGraphicsItem不随QGraphicsView放大缩小而改变大小
(本来上传代码时填写积分为0的,现在没有了这个选项,最低一分,如果没有积分的小伙伴@我)
一、简述在使用QGraphicsView过程中,有时候我们需要对view进行缩放,但是对于一般正常的加入view中的item都会随着view的大小变化而变化,但是如果我们想让某些item不随view的缩放进行改变怎么办呢?很简单,下面讲述两种方法供大家参考学习。二、代码之路首先讲述如何通过鼠标滚轮使view放大缩小。很简单,继承QGraphicsView类,然后重写wheelEvent()事件即可。
【QT】基于QGraphicsView的显示控件,支持加载图片,卸载图片,支持鼠标放大、缩小、拖动,一件恢复出示状态。并且支持三种类型的图片,包含QPixmap、QImage、cv::Mat。
使用时只需要初始化该类,并将其添加到布局中即可。
当前开发的平台是基于Qt6.2.3+MSVC2019的,其他版本需要做相应的修改。
在使用上有相关疑问,请给我留言,或者进入到我的主页,查询相关博客,获取使用案例。
博客地址:https://blog.csdn.net/xiaohuihuihuige/article/details/128165275
喜欢就点个关注吧,更多qt自定义控件等你解锁。
在QGraphicsScene中,拖动鼠标缩放矩形QGraphicsRectItem的技术探索
1.QGraphicsRectItem m_BlockItem是需要缩放的矩形;
2.鼠标左击按住矩形四个角后拖动,矩形m_BlockItem做相应的放大和缩小;
3.左边的小三角形还需要保持在左边中点附近;
1.先新建一个QGraphicsRectItem m_BlockItem,作为大矩形(目标矩形);
2.在创建四个小正方形QGraphicsRectItem m_SmallRect_0、m_
QPointF p1 = mapToScene(point);
setScale(scale() * (1 + 0.1));//等百分比缩放
QPointF p2 = mapToScene(point);
setPos(pos...
Qt 通过重写QGraphicItem实现绘制、拖动、缩放、旋转矩形
本例程通过重写了一个类,继承自QGraphicItem,来实现了在qgraphicsScene上绘制、拖动、缩放、旋转矩形。
效果如下:
其实要实现绘制、拖动、缩放矩形都不难,难的是在旋转之后还要支持缩放。
我的思路是:
1.实现绘制矩形:只要定义一个全局变量QRectF m_oldRect,在外面矩形大小传进来,然后在paint函数里面绘制这个矩形就行
2.实现拖动矩形:重写mousePressEvent,mouseMoveEvent
图2 缩放scene
可以看出缩放view时Item显示也会跟着放大缩小,缩放scene则Item显示大小不会随之变化。Item几何信息是根据View视口而定?源码 //此时View设置大小为400X300
scene->setSceneRect(0,0,4000,3000);
QGraphicsRectItem* item = new
要改变Qt QGraphicsItem的大小,可以使用setScale()方法。setScale()方法接受一个QPointF参数,该参数指定了x和y方向的缩放比例。例如,如果要将QGraphicsItem的大小增加50%,可以使用以下代码:
item->setScale(1.5, 1.5);
其中item是指向QGraphicsItem对象的指针。如果只想在一个方向上缩放,可以将另一个参数设置为1.。例如,如果只想在x方向上缩放50%,可以使用以下代码:
item->setScale(1.5, 1.);
这将使QGraphicsItem在x方向上增加50%,而在y方向上保持不变。