gpt4 book ai didi

c++ - 如何缩放以窗口中心为原点的图形?

转载 作者:行者123 更新时间:2023-11-28 01:28:20 24 4
gpt4 key购买 nike

QPainter::scale 以窗口的左上角为原点。为了使用窗口的中心作为原点,我想我可以先使用 QPainter::translate 将坐标系的原点平移到窗口的中心,然后缩放图形:

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr) :
QMainWindow(parent) {
resize(600, 400);
}

protected:
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
// draw a rectangle
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
painter.drawRect(rectangle);

// translate the origin of coordinate system to the center of window
QPointF offset = rect().center();
painter.translate(offset);

// scale the rectangle
painter.scale(2,2);
painter.drawRect(rectangle);
}
};

该示例产生以下结果:

Window with rectangles

问题是比例仍然是关于左上角的。

如何解决?


以下是我的解决方案。

QPainter painter(this);
// draw a rectangle
QRectF rectangle1(10.0, 20.0, 80.0, 60.0);
painter.drawRect(rectangle1);

// scale the rectangle by 2 times
QRectF rectangle2(10.0, 20.0, 80.0 * 2, 60.0 * 2);
// move it to the center of window
QPointF offset = rect().center() - rectangle2.center();
painter.translate(offset);
painter.drawRect(rectangle2);

然后我得到了我想要的: enter image description here

最佳答案

找到应该应用于 QPainter 的适当变换不是一项简单的任务,因为它涉及将一个元素置于另一个元素的中心、移动它等。最简单的事情是如下所示变换矩形:

void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// draw a rectangle
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
painter.drawRect(rectangle);
// scale
rectangle.setSize(2*rectangle.size());
// translate
rectangle.moveCenter(rect().center());
painter.drawRect(rectangle);
}

关于c++ - 如何缩放以窗口中心为原点的图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com