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