Tôi gặp vấn đề tương tự, và phải mất một lúc để tìm ra. Đây là cách tôi giải quyết nó.
Mở rộng lớp QGraphicsItem, ghi đè lên sơn(). Bên trong lớp sơn(), đặt lại hệ số co giãn của biến đổi thành 1 (là m11 và m22), và lưu hệ số tỷ lệ m11 (x) và m22 (hệ số tỷ lệ y) trước khi đặt lại. Sau đó, vẽ như bạn thường làm nhưng nhân x của bạn với m11 và y với m22. Điều này tránh được việc vẽ với phép biến đổi mặc định, nhưng tính toán rõ ràng các vị trí theo chuyển đổi của cảnh.
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
QTransform t = painter->transform();
qreal m11 = t.m11(), m22 = t.m22();
painter->save(); // save painter state
painter->setTransform(QTransform(m11, t.m12(), t.m13(),
t.m21(), 1, t.m23(), t.m31(),
t.m32(), t.m33()));
int x = 0, y = 0; // item's coordinates
painter->drawText(x*m11, y*m22, "Text"); // the text itself will not be scaled, but when the scene is transformed, this text will still anchor correctly
painter->restore(); // restore painter state
}
Khối mã sau đây được vẽ với chuyển đổi mặc định
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
int x = 0, y = 0;
painter->drawText(x, y, "Text");
}
Bạn có thể thử cả hai để thấy sự khác biệt. Hi vọng điêu nay co ich.
Ngoài ra hãy đỉnh tại http://doc.trolltech.com/4.5/qpen.html#setCosmetic nếu bạn đang sử dụng một lớp sơn tùy chỉnh thói quen – mpen