基本概念
Qt图形系统中的坐标系
物理坐标系(设备坐标系)
-
原点(0, 0)在左上角的位置,单位:像素(点)
- x坐标向右增长,
- y坐标向下增长
逻辑坐标系
- 数学模型中的抽象坐标系,单位由具体问题决定。坐标轴的增长方向由具体问题决定
视口与窗口
视口(viewport)
物理坐标系中一个任意指定的矩形
窗口(window)
逻辑坐标系下对应到物理坐标系中的相同矩形
深入理解视口与窗口
视口与窗口是不同坐标系中的同一个矩形视口与窗口中的坐标点存在一映射的关系。视口与窗口能够通过坐标变换而相互转换
代码
#include "mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setFixedSize(200,200);
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setViewport(0,0,width(),height());
painter.setWindow(-100,100,200,-200); // 设置左上角坐标 (-100,100) ,右下角坐标 (100,-100)
painter.drawLine(QPoint(0,0),QPoint(100,100));
}
#include "mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setFixedSize(200,200);
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
// painter.setViewport(0,0,width(),height());
// painter.setWindow(-100,100,200,-200); // 设置左上角坐标 (-100,100) ,右下角坐标 (100,-100)
painter.drawLine(QPoint(0,0),QPoint(100,100));
}
绘制正弦波
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
void paintEvent(QPaintEvent *);
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QPainter>
#include <QPen>
#include <QPointF>
#include <qmath.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen;
pen.setColor(Qt::green);
pen.setStyle(Qt::SolidLine);
pen.setWidth(0.01);
painter.setPen(pen);
painter.setViewport(50,50,width()-100,height()-100);
painter.setWindow(-10,2,20,-4);
painter.fillRect(-10,2,20,-4,Qt::black);
painter.drawLine(QPointF(-10,0),QPointF(10,0));
painter.drawLine(QPointF(0,2),QPointF(0,-2));
// 效率低,在实际中建议建立 LinkList 等来进行缓存,减少运算
for (float x =-10;x<10;x+=0.05)
{
float y = qSin(x);
painter.drawPoint(QPointF(x,y));
}
}
动态基础图像绘制
#include "mainwindow.h"
#include <QPainter>
#include <QPen>
#include <QPointF>
#include <qmath.h>
#include <QTime>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),precision(-10.98)
{
setFixedSize(800,500);
update_time.stop();
update_time.setInterval(100);
update_time.start();
connect(&update_time,SIGNAL(timeout()),this,SLOT(time_update()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen;
pen.setColor(Qt::green);
pen.setStyle(Qt::SolidLine);
pen.setWidth(0.01);
painter.setPen(pen);
painter.setViewport(50,50,width()-100,height()-100);
painter.setWindow(-10,2,20,-4);
painter.fillRect(-10,2,20,-4,Qt::black);
painter.drawLine(QPointF(-10,0),QPointF(10,0));
painter.drawLine(QPointF(0,2),QPointF(0,-2));
for(int i=0; i<m_drawList.count(); i++)
{
painter.drawPoint(m_drawList[i]);
qDebug()<<"tmp = "<<tmp.rx()<<tmp.ry();
}
}
void MainWindow::time_update()
{
precision += 0.1;
float y = qSin(precision);
tmp = QPointF(precision,y);
m_drawList.append(QPointF(tmp));
update();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <QTimer>
class MainWindow : public QMainWindow
{
Q_OBJECT
QList<QPointF> m_drawList;
QTimer update_time;
float precision;
QPointF tmp;
void paintEvent(QPaintEvent *);
private slots:
void time_update(void);
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
自制画图板:
后面补充。。。
总结
后面补充。。。