Qt 绘图

基本概念

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

 

 

自制画图板:

后面补充。。。

 

总结

后面补充。。。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值