Qt

QGraphicsItem rotate(翻转),Text No

2015-03-24  本文已影响1199人  HikeForWELL

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
上一篇下一篇

猜你喜欢

热点阅读