美文网首页Qt
QGraphicsItem rotate(翻转),Text No

QGraphicsItem rotate(翻转),Text No

作者: HikeForWELL | 来源:发表于2015-03-24 23:45 被阅读1199次

    You rotate , and i don't.

    反转

    在处理图形中经常要碰到对图元进行翻转,翻转的时候图元中的文字也跟随着翻转起来,但,这可不是我想要的结果。
    我想要的是图形变,但文字仍然保持原样(我可犯贱,你要一直仰望--!)。
    Google,百度了很多但没找到大牛对这个问题的解决方案,估计太弱了他们都不屑啊,后来结合同事在程序中使用的方法才想到其实可以这样的...

    [失败的方法]在QGraphicsItem::paint(...)函数中绘制文本

    QPainter Class
    一开始,对Qt的应用不懂变通,一直使用在item的paint函数中进行图形以及Text的绘制。

    QPainter o_painter(this);
    o_painter.drawText(rect, Qt::AlignCenter, tr("Hi, Slark!"));
    

    然后如果要对文字进行一些翻转可能就需要对QPainter进行rotate了。

    o_painter.roate(90);
    

    但是这种实现方法不便于后续控制item的旋转,于是...

    [成功的方式]继承item,拥有Text子item

    QGraphicsObject Class
    也就是说对于我们要绘制的图元,自己继承并实例化一个类,该类包含绘制文本的子成员。

    class CGraphicsObj : public QGraphicsObject
    {
        ....
    }
    
    class CGraphicsObjText : public QGraphicsObject
    {
        ....
        void  paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    }
    
    class CGraphicsObjCell : public CGraphicsObj
    {
        ....
         void  paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
        
        private:
        CGraphicsObjText *mopText;
    }
    

    然后,在CGraphicsObjText中负责文字的绘制,这样就拥有了2个独立的Item图元了。

    void CGraphicsObjCell::mvSetupText(const QString &str)
    {
        mopText = new CGraphicsObjText(this);
    }
    

    但需要把mopText的parent设置为它所处的Cell对象中,这样不需要手动去控制Text元素的显示,只需要把Cell元素添加到scene中就可以了。

    CGraphicsObjCell *op_cell = new CGraphicsObjCell();
    scene()->addItem(op_cell);
    

    接下来就是最终进行元素翻转的步骤了,按正常方式在Cell的paint函数中绘制好Cell元素,通过内部函数进行Cell的翻转,翻转后Text也会跟随父对象翻转,怎么办,当然是把它翻回来!

    CGraphicsObjCell::mvRotateCell(qreal angel)
    {
        rotate(angel);
        if (mopText)
            mopText->rotate(-1 * angel);
    }
    

    大致思路如上,当然实际翻转有很多情况,可以按照自己需要来进行上翻,下翻,以X轴,以Y轴,文字横向,文字纵线等等。

    其他方法

    另外一个方法就是使用类似事件的方式,监控ParentItem发生的旋转,然后在处理旋转时候依次处理Text的旋转。

    相关flag
    setFlag(ItemSendsGeometryChanges);
    

    然后在相关函数中处理,处理方式与下面代码相似

    itemChange

    相关文章

      网友评论

        本文标题:QGraphicsItem rotate(翻转),Text No

        本文链接:https://www.haomeiwen.com/subject/dvmgxttx.html