窗口和视口的关系
来源:互联网 发布:手机怎样备份所有数据 编辑:程序博客网 时间: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
- 窗口和视口的关系
- 控件和窗口的关系
- WNDCLASS(窗口类)和hWnd的关系
- 裁剪区视见区和物理窗口的关系
- window.open子窗口和父窗口的关系
- 窗口创建和关系
- “窗口类、窗口类的对象和窗口”三者的关系
- 活动窗口(Active),焦点窗口(Focus)和前景窗口(Foreground)之间的关系
- 活动窗口(Active),焦点窗口(Focus)和前景窗口(Foreground)之间的关系
- MFC子窗口和父窗口(SetParent,SetOwner) 窗口关系隐藏显示介绍的挺好
- MFC子窗口和父窗口(SetParent,SetOwner) 窗口关系隐藏显示介绍的挺好
- 多文档 主框架窗口、客户窗口、子窗口和视图的关系,有图显示
- CWnd类的对象和Windows窗口之间的关系
- TCP滑动窗口和socket缓冲区之间的关系
- TCP滑动窗口和socket缓冲区之间的关系(记录)
- TCP滑动窗口和SO_RCVBUF之间的实际关系
- [总结]TCP滑动窗口和SO_RCVBUF之间的关系
- TCP滑动窗口和socket缓冲区之间的关系(记录)
- css 比较 在同一个水平线上
- MapReduce任务运行到running job卡住
- Hadoop经典案例Spark实现(一)——通过采集的气象数据分析每年的最高温度
- mybatis 根据Map字段对应值更新
- 下面放一段可以启动的,位置无关的arm bootloader简易启动:
- 窗口和视口的关系
- JavaScript小技巧
- MySQL字符串连接函数
- Netbeans配置OpenCv
- ibatis 中 $与#的区别
- pdf在线转jpg格式的转换方法分享
- 学习lambda表达式
- 每天一个linux命令(42):ping命令
- 测试