反转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的旋转。
相关flagsetFlag(ItemSendsGeometryChanges);
然后在相关函数中处理,处理方式与下面代码相似
itemChange
网友评论