Qt基于QGraphicsObject自定义图元

 

全文链接:http://www.fearlazy.com/index.php/post/110.html

上一篇文章通过继承QGraphicsItem类来定制自己的图元类,这样就可以根据自己的需求来制作它的形状、颜色、属性以及交互等。但是这样的图元会存在一个缺点,那就是不能使用Qt的信号/槽机制,也不能使用Qt属性系统,因为QGraphicsItem并不继承于QObject。缺少信号/槽这样好用的机制会使得自定义图元与其他对象交互变得很不方便,不能使用属性系统也会让类失去更多的扩展性。总之不从QObject派生类会给类的使用带来很多的不利。

     好在Qt已经考虑到了这些问题,QGraphicsObject应运而生。QGraphicsObject同时继承于QObject和QGraphicsItem。这样自定义图元既可以获得QGraphicsItem中写好的图元特性又能使用信号/槽机制方便信息传递。

    举例:

    在上一篇的例子上进行修改,实现这样的效果:在场景中添加几个自定义图元,当鼠标移动到一个图元之上,所有图元的文字都变为“yes”。

  与上一篇例子相比多了一个通知过程,即鼠标移动到一个图元之上时让其他图元设置文本的内容。

    1. 创建一个CustomObject类,父类为QObject。 注意别忘记写Q_OBJECT宏。给类添加一个sigMouseHover信号,表示鼠标在图元上方。

    2. 重写boundingRect和paint函数,定制图元的外观。

blob.png

    3. 重写图元的鼠标悬浮进入事件,该函数的作用就是发送信号,其他操作按父类进行。需要注意的是图元类默认不接收hover的相关事件,需要调用setAcceptHoverEvents(true)。

blob.png

    4.创建自定义图元并添加到场景中。

blob.png    在此创建了4个自定义图元,图元的文字分别为hello、fearlazy、come、co。创建图元后连接信号到Widget的sltMouseOnItem槽中,并将对象添加到m_objList容器中。

    sltMouseOnItem的作用就是遍历m_objList这个容器,将所有的自定义图元为全部设置为"yes"。代码如下:

blob.png

    5.运行效果:

鼠标移动到图元上

blob.png

鼠标移动到任一图元上

blob.png

 

 

作者:fearlazy 一个入行5年的程序员新人。 文章内容仅代表个人观点,如有雷同请为我点个赞吧!

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt QGraphicsView是一个强大的形界面框架,可以让用户轻松地在形视中显示和编辑形元素。在Qt中,QGraphicsItem是QGraphicsScene中的基本元素,它可以表示任何类型的元,如线条、多边形、文本、像等。在本文中,我们将介绍如何使用Qt QGraphicsView创建自定义元。 1. 创建自定义元类 首先,我们需要创建一个自定义元类,继承自QGraphicsItem。这个类可以是任何自定义形元素,比如矩形、圆形、多边形等。在这里,我们将创建一个简单的矩形元类。 class MyRectItem : public QGraphicsItem { public: MyRectItem(QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; }; 2. 实现boundingRect和paint函数 在自定义元类中,我们需要实现boundingRect和paint函数。boundingRect函数返回一个QRectF对象,用于定义元的边界框。paint函数用于绘制元。 QRectF MyRectItem::boundingRect() const { return QRectF(-50, -50, 100, 100); } void MyRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) Q_UNUSED(widget) painter->setPen(QPen(Qt::black, 2)); painter->setBrush(QColor(255, 0, 0, 50)); painter->drawRect(-50, -50, 100, 100); } 3. 在场景中添加元 在主程序中,我们可以创建一个QGraphicsScene对象,并在其中添加自定义元对象。然后,我们可以使用QGraphicsView来显示这个场景。 QGraphicsScene *scene = new QGraphicsScene; MyRectItem *rectItem = new MyRectItem; scene->addItem(rectItem); QGraphicsView *view = new QGraphicsView(scene); view->show(); 4. 运行程序 现在,我们可以运行程序,并看到我们刚刚创建的矩形元。可以通过移动、缩放、旋转等操作来编辑元。 通过这个简单的例子,我们可以看到如何使用Qt QGraphicsView创建自定义元。可以扩展这个例子来创建更复杂的元,比如多边形、文本、像等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fearlazy

打赏是不可能的

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

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

打赏作者

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

抵扣说明:

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

余额充值