默认情况下,窗口和视口值得的都是绘图设备的那个矩形。
在Win10下,没有改变一个自定义的widget的尺寸时(通过resize() 函数,resize() 函数的参数是物理像素),画出的widget是640×480物理像素的。
void PaintD::paintEvent(QPaintEvent *)
{
painter.begin(this);
painter.fillRect(0, 0, 200, 200, Qt::green);
painter.drawPoint(100, 100);
painter.drawLine(0,0, 100, 100);
painter.end();
}
使用默认的窗口的物理大小,此时的逻辑坐标和物理坐标一致:
当改变窗口的逻辑尺寸,注意物理尺寸默认的仍然是640*480的物理像素大小。
void PaintD::paintEvent(QPaintEvent *)
{
painter.begin(this);
painter.setWindow(0, 0, 200, 200); //设置逻辑坐标窗口的尺寸
painter.fillRect(0, 0, 200, 200, Qt::green);
painter.translate(100, 100); //平移坐标原点到矩形的中心
painter.drawPoint(100, 100);
painter.drawLine(0,0, 100, 100);
painter.end();
}
当改变窗口坐标系之后再修改视口坐标系:
void PaintD::paintEvent(QPaintEvent *)
{
painter.begin(this);
painter.setWindow(0,0,200, 400);
painter.setViewport(0, 0, 200, 200); //设置逻辑坐标窗口的尺寸
painter.fillRect(0, 0, 200, 200, Qt::green);
painter.drawPoint(100, 100);
painter.drawLine(0,0, 100, 100);
painter.end();
}
此时视口的大小为 200×200/200 = 200, 200×200/400 = 100.
也就是绿色的区域的大小为200*100 物理像素。
给人的感觉是:画图的区域由视口和窗口的较小的那个决定,包括QPainter 的坐标。较小的那个尺寸需要按照较大的那个,按照比例来换算。较大的那个的尺寸是物理像素尺寸。