基于QGraphics的简易画板1

最近制作一个画板实现自定义绘图,之前写的画板程序是关于QPainter的,画布缩放效果不理想,也不能实现图元的平移,所以一直想写一个基于QGraphics的画板。

因为代码有点长,在这里分享绘制直线和圆的代码.

   1、首先是mainwindow.h文件:声明相关的按钮控件和实现方法

extern bool isline; //在类声明之前,先声明全局变量,方便在主窗口调用
extern bool iscircle;
private:
    QPushButton *line,*circle; //图形按钮选择
    QPushButton *finish; //绘图完成
    void Line();  //实现按钮函数
    void Circle();
    void Finish();

  2、mainwindow.cpp文件:

bool isline=false;  bool iscircle=false; //全局变量赋值
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(1200,1000);//设置窗口大小

    line=new QPushButton("线",this); 
    circle=new QPushButton("圆",this);
    finish=new QPushButton("完成",this);
    line->setGeometry(0,80,50,30);
    circle->setGeometry(0,110,50,30);
    finish->setGeometry(0,170,50,30);
    connect(line,&QPushButton::clicked,this,&MainWindow2::Line);
    connect(circle,&QPushButton::clicked,this,&MainWindow2::Circle);
    connect(finish,&QPushButton::clicked,this,&MainWindow2::Finish);

    Scene *scene=new Scene;  //自定义scene
    Myview *view=new Myview;  //自定义view
    QGridLayout *lay=new QGridLayout;
    view->setScene(scene);
    setCentralWidget(view);
    view->setGeometry(50,50,1000,800);
    view->translate(QPoint(-500,400));
    lay->addWidget(view);
}
void MainWindow::Line(){
    isline=true;   iscircle=false;
}
void MainWindow::Circle(){
    iscircle=true;   isline=false;
}
void MainWindow::Finish(){
    isline=iscircle=false;
}

  3、在自定义的scene里实现鼠标事件

myscene.h:

protected:
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); //移动
    void mousePressEvent(QGraphicsSceneMouseEvent *event);//按下
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);//松开
private:
    QPointF lastpoint,endpoint; //存储鼠标的按下和放开时的坐标

 myscene.cpp: 

#include "mainwindow.h" //用于调用主窗口的全局变量

Scene::Scene(QWidget *parent):QGraphicsScene(parent)
{
    setSceneRect(-INT_MIN/2,-INT_MIN/2,INT_MAX,INT_MAX); //设置场景边界矩形
}
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){
        lastpoint=event->scenePos();
    }
    endpoint=lastpoint;
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button()&Qt::LeftButton){
        endpoint=event->scenePos();
        update();
    }
}
void Scene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
   if(event->button()==Qt::LeftButton){
       endpoint=event->scenePos();update();
if(isline==true){ //接收到按钮信号后进行绘图 if(lastpoint!=endpoint){ //避免画点的情况 QGraphicsLineItem *line=new QGraphicsLineItem(lastpoint.x(),lastpoint.y(),endpoint.x(),endpoint.y()); this->addItem(line); } } if(iscircle==true){ qreal r=sqrt(pow((endpoint.x()-lastpoint.x()),2)+pow((endpoint.y()-lastpoint.y()),2)); QGraphicsEllipseItem *circle=new QGraphicsEllipseItem(lastpoint.x()-r,lastpoint.y()-r,r*2,r*2); this->addItem(circle); } } }

  4、完成自定义绘图后,可以直接引用之前图元缩放和平移的代码: https://www.cnblogs.com/Ivy-yang/p/tuzi-transform.html

 

转载于:https://www.cnblogs.com/Ivy-yang/p/tuzi-draw.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值