即。如果我在 Qt5 tutorial中指定的示例中指定了一些立方行:
QPainterPath path;
path.addRect(20, 20, 60, 60);
path.moveTo(0, 0);
path.cubicTo(99, 0, 50, 50, 99, 99);
path.cubicTo(0, 99, 50, 50, 0, 0);
QPainter painter(this);
painter.fillRect(0, 0, 100, 100, Qt::white);
painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,
Qt::FlatCap, Qt::MiterJoin));
painter.setBrush(QColor(122, 163, 39));
painter.drawPath(path);
现在我想只渲染QImage
上某些区域指定的曲线的一部分,其中起点= [20px,50px],宽度= 80px,高度= 50px,因此结果如下所示:
或者如果可能的话,使用3倍变焦进行渲染,因此结果QImage
看起来相同,但尺寸= [240px,150px]
我是Qt的新手,有人可以向我展示一个有效的代码示例吗?
答案 0 :(得分:2)
您可以转换画家坐标系:
QPainter painter(this);
painter.scale(3, 3); // zoom 3 times
painter.translate(-20, -50); // offset origin to 20x50
// ... render stuff
这比其他答案有一个优势,因为它会被渲染为好像你提供了更大的坐标,而不是渲染它,然后放大光栅图像,这会降低图像质量。此外,Qt可能会优化它以便不在图像外部渲染,因此它会渲染得更少,而且您不需要裁剪并抛弃结果。
结果:
将其与放大的栅格进行比较:
答案 1 :(得分:-1)
我为您准备了一个代码示例。但要找出方法并不难。您只需阅读文档,一切都很容易找到。 Qt的文档非常棒。
QApplication a(argc, argv);
QImage img(100, 100, QImage::Format_ARGB32);
QPainterPath path;
path.addRect(20, 20, 60, 60);
path.moveTo(0, 0);
path.cubicTo(99, 0, 50, 50, 99, 99);
path.cubicTo(0, 99, 50, 50, 0, 0);
QPainter painter(&img);
painter.fillRect(0, 0, 100, 100, Qt::white);
painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,
Qt::FlatCap, Qt::MiterJoin));
painter.setBrush(QColor(122, 163, 39));
painter.drawPath(path);
painter.end();
QPixmap pixmap( QPixmap::fromImage(img).copy(20, 50, 80, 50).scaled(240,150) );
// option 1, use a QLabel ( only for simple cases )
QLabel label;
label.setPixmap( pixmap );
label.show();
// option 2, use a QGraphicsScene ( far more flexible )
QGraphicsView view;
QGraphicsScene scene;
scene.addPixmap( pixmap );
scene.setSceneRect( img.rect() );
view.setScene(&scene);
view.show();
return a.exec();