窗口和视口的关系

来源:互联网 发布:手机怎样备份所有数据 编辑:程序博客网 时间:2024/05/16 06:12

窗口和视口的理解

之前在VC中对窗口和视口的概念没有理解清楚,比较模糊,今天研究Qt又碰到这个问题,于是花了好长时间验证和查阅资料,最后总算是搞清楚了,再次整理,希望可以帮到别人。。

个人理解:窗口相当于一块画板,在上面划分好坐标系就可以开始作画了,视口就相当于一个窗口,通过这个窗口去观察你的画板,当然这个视口需要设置大小,以及从哪个位置去观看画板,距离画板多远,可以看到图形变大变小。。。

我觉得这些就是窗口和视口所要表达的基本意思了,总的来说就是你在逻辑坐标上去画,完了后设备坐标要确定最终显示的位置和区域

下面是自己在研究中写的一个小例子,可完全理解窗口和视口的概念

头文件很简单没什么就不贴了

#include "widget.h"#include "ui_widget.h"#include <qdebug.h>#include <qpainter.h>#include <QPen>#include <QPaintEvent>#include <QRect>#include <QPoint>#include <QTimer>#include <QTime>QPoint sec[4] = {QPoint(0, 10), QPoint(3, 0), QPoint(0, -90), QPoint(-3, 0)};QPoint min[4] = {QPoint(0, 8), QPoint(5, 0), QPoint(0, -70), QPoint(-5, 0)};QPoint hour[4] = {QPoint(0, 6), QPoint(7, 0), QPoint(0, -50), QPoint(-7, 0)};Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    InitStyle();}Widget::~Widget(){    delete ui;}void Widget::InitStyle(){    setWindowTitle("clock");    //resize(800, 800);    QTimer* time = new QTimer(this);    connect(time, SIGNAL(timeout()), this, SLOT(update()));    time->start(1000);}void Widget::paintEvent(QPaintEvent *event){    QPainter paint(this);/* * 逻辑坐标 * 设置逻辑坐标(-100,-100)对应设备坐标的零点 * 设置逻辑宽(200)和高(200)分别对相应设备的宽和高 * 这样绘制的图形就与设备的大小和分辨率无关,一直是充满设备的大小,这就是视口和窗口的作用 * (逻辑坐标中绘制在100逻辑单位之外的就不能显示到设备上)*/    paint.setWindow(-100, -100, 200, 200);/* * 设备坐标 (图像最终在设备上显示的坐标位置和大小) * 默认上面设置的(-100,-100)对应设备的零点,设置后就是对应设备的(100,100) * 设置后逻辑坐标的宽和高就对应设备的宽和高(200,200),即在设备上就固定大小(200,200) * (使用这种方式不需要修改逻辑代码绘图坐标即可轻松移动图形或者放大缩小图形,做到了逻辑和设备的分离)*/    //paint.setViewport(100, 100, 200, 200);    //放开后就是固定大小200    paint.save();    //paint.setPen(QPen(Qt::black, 10));    //paint.rotate(6);    //顺时针旋转坐标轴    //paint.drawLine(50, 50, 100, 50);    for (int i = 0; i < 60 ; ++i)    {        paint.rotate(6);  //rotate()是顺时针旋转坐标轴        if (i % 5 == 4)        {            paint.setPen(QPen(Qt::black, 5));            paint.drawLine(0, -90, 0, -100);        }        else        {            paint.setPen(QPen(Qt::black, 1));            paint.drawLine(0, -95, 0, -100);        }    }    paint.restore();    int s = QTime::currentTime().second();    int m = QTime::currentTime().minute();    int h = QTime::currentTime().hour();    paint.drawText(-20, 50, QTime::currentTime().toString());    //时针    paint.save();    paint.rotate(((h % 12) +  static_cast<double>(m / 60.0)) * 30);    paint.setBrush(Qt::blue);    paint.setPen(Qt::blue);    paint.drawConvexPolygon(hour, 4);   //绘制不规则的多边形    paint.restore();    //分针    paint.save();    paint.rotate(m * 6);    paint.setBrush(Qt::green);    paint.setPen(Qt::green);    paint.drawConvexPolygon(min, 4);    paint.restore();    //秒针    paint.save();    paint.rotate(s * 6);    paint.setBrush(Qt::red);    paint.setPen(Qt::red);    paint.drawConvexPolygon(sec, 4);    paint.restore();}

效果图:
这里写图片描述

1 0
原创粉丝点击