基于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