void MyGraphicsItem::flipHorizontal() { // Get the current transform QTransform transform(this->transform()); qreal m11 = transform.m11(); // Horizontal scaling qreal m12 = transform.m12(); // Vertical shearing qreal m13 = transform.m13(); // Horizontal Projection qreal m21 = transform.m21(); // Horizontal shearing qreal m22 = transform.m22(); // vertical scaling qreal m23 = transform.m23(); // Vertical Projection qreal m31 = transform.m31(); // Horizontal Position (DX) qreal m32 = transform.m32(); // Vertical Position (DY) qreal m33 = transform.m33(); // Addtional Projection Factor // We need this in a minute qreal scale = m11; // Horizontal flip m11 = -m11; // Re-position back to origin if(m31 > 0) m31 = 0; else m31 = (boundingRect().width() * scale); // Write back to the matrix transform.setMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33); // Set the items transformation setTransform(transform); } void MyGraphicsItem::flipVertical() { // Get the current transform QTransform transform(this->transform()); qreal m11 = transform.m11(); // Horizontal scaling qreal m12 = transform.m12(); // Vertical shearing qreal m13 = transform.m13(); // Horizontal Projection qreal m21 = transform.m21(); // Horizontal shearing qreal m22 = transform.m22(); // vertical scaling qreal m23 = transform.m23(); // Vertical Projection qreal m31 = transform.m31(); // Horizontal Position (DX) qreal m32 = transform.m32(); // Vertical Position (DY) qreal m33 = transform.m33(); // Addtional Projection Factor // We need this in a minute qreal scale = m22; // Vertical flip m22 = -m22; // Re-position back to origin if(m32 > 0) m32 = 0; else m32 = (boundingRect().height() * scale); // Write back to the matrix transform.setMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33); // Set the items transformation setTransform(transform); } void dump_transform(QTransform& t, const char* name) { qreal _m11 = t.m11(); // Horizontal scaling qreal _m12 = t.m12(); // Vertical shearing qreal _m13 = t.m13(); // Horizontal Projection qreal _m21 = t.m21(); // Horizontal shearing qreal _m22 = t.m22(); // vertical scaling qreal _m23 = t.m23(); // Vertical Projection qreal _m31 = t.m31(); // Horizontal Position (DX) qreal _m32 = t.m32(); // Vertical Position (DY) qreal _m33 = t.m33(); // Addtional Projection Factor qDebug("================ %s ==================", name); qDebug("m11: %f, m12: %f, m13: %f", _m11, _m12, _m13); qDebug("m21: %f, m22: %f, m23: %f", _m21, _m22, _m23); qDebug("m31: %f, m32: %f, m33: %f", _m31, _m32, _m33); }