最近制作一个画板实现自定义绘图,之前写的画板程序是关于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