You rotate , and i don't.
在處理圖形中經(jīng)常要碰到對圖元進行翻轉铐尚,翻轉的時候圖元中的文字也跟隨著翻轉起來拨脉,但,這可不是我想要的結果宣增。
我想要的是圖形變玫膀,但文字仍然保持原樣(我可犯賤,你要一直仰望--5ⅰ)帖旨。
Google,百度了很多但沒找到大牛對這個問題的解決方案灵妨,估計太弱了他們都不屑啊解阅,后來結合同事在程序中使用的方法才想到其實可以這樣的...
[失敗的方法]在QGraphicsItem::paint(...)函數(shù)中繪制文本
QPainter Class
一開始,對Qt的應用不懂變通泌霍,一直使用在item的paint函數(shù)中進行圖形以及Text的繪制瓮钥。
QPainter o_painter(this);
o_painter.drawText(rect, Qt::AlignCenter, tr("Hi, Slark!"));
然后如果要對文字進行一些翻轉可能就需要對QPainter進行rotate了。
o_painter.roate(90);
但是這種實現(xiàn)方法不便于后續(xù)控制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函數(shù)中繪制好Cell元素纫雁,通過內部函數(shù)進行Cell的翻轉煌往,翻轉后Text也會跟隨父對象翻轉,怎么辦轧邪,當然是把它翻回來刽脖!
CGraphicsObjCell::mvRotateCell(qreal angel)
{
rotate(angel);
if (mopText)
mopText->rotate(-1 * angel);
}
大致思路如上羞海,當然實際翻轉有很多情況,可以按照自己需要來進行上翻曲管,下翻却邓,以X軸,以Y軸院水,文字橫向腊徙,文字縱線等等。
其他方法
另外一個方法就是使用類似事件的方式檬某,監(jiān)控ParentItem發(fā)生的旋轉撬腾,然后在處理旋轉時候依次處理Text的旋轉。
setFlag(ItemSendsGeometryChanges);
然后在相關函數(shù)中處理,處理方式與下面代碼相似