Qt实训项目----(1)
1. 创建窗体工程mainwindow,并且在窗体绘画区域内加载并显示图片;
2. 在工具栏中添加绘图工具,点击后由默认图标变为“+”图标,并且能使用操作工具在绘图区内画任一图形(三角形、正方形、圆形等);
3. 在绘图区内实现右键取消绘图功能;
创建工程就不再赘述了,在窗体绘画区域内加载并显示图片,有好几种做法,在这里由于还需要后面功能的使用,我们就只用重绘事件来显示了
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter p(this);
QPen pen(QColor(255,0,0));
// QBrush brush(QColor(0,255,0,125));
p.setPen(pen);
// p.setBrush(brush);
p.setRenderHint(QPainter::Antialiasing);
//把图片绘制到绘图区域
QPixmap pix; //必须实例化一个pix才能去绘制
pix.load(":/new/img/earth.jpg");
p.drawPixmap(0,25,
ui->centralWidget->width(),
ui->centralWidget->height(),pix)
}
由于我们是直接绘制到绘图区域内,那么我们可以直接用画笔绘制(当然你也可以用画布,但是画布比较麻烦就不演示了毕竟也是新手)。 -----在这里我们要注意,所谓的绘画区域是工具栏和状态栏之间的部分,所以我们用p.drawPixmap(0,0,pix)是错误的,因为这样绘制的图片超过了绘图区域(还得看你们经理的想法,我开始也是这样用的,但是在我经理那里不通过)。而且这里的25是我测过的工具栏的宽度,当然如何要细节的话就得写成p.drawPixmap(0,rect.height(), ui->centralWidget->width(),ui->centralWidget->height(),pix); 这里的rect对象还得定义就不多说了。
然后在工具栏中添加操作工具(直接最简单的),使用ui直接在界面里面添加相应的动作,然后给拖到工具栏即可(如何添加就不再多说了,如果不会,那就证明你不适合这行,趁早转业把,QAQ)。
这里多添加了两个操作工具是因为我后面要用到。~
点击后会转变为“+”图标。—知道要在点击后改变,证明只在这一段生命周期有用,所以我们只需要在槽函数设置为开始转变,功能完成之后就初始化就好了。
void MainWindow::on_actionLine_triggered()
{
setCursor(Qt::CrossCursor);
_drawState=1;
}
void MainWindow::on_actionRect_triggered()
{
setCursor(Qt::CrossCursor);
_drawState=2;
}
void MainWindow::on_actionEllipse_triggered()
{
setCursor(Qt::CrossCursor);
_drawState=3;
}
void MainWindow::on_actionTriangle_triggered()
{
setCursor(Qt::CrossCursor);
_drawState=4;
}
由于这里有好几个功能,所以我们要设置一个状态去分辨。_drawState就是我们设置的状态,而这里的状态刚好在绘制图形中分辨。 setCursor(Qt::CrossCursor)这个函数就是鼠标变化之后的函数,由于在枚举类中有定义就不用我们再次加载资源了。
然后就是我们的绘制图形的功能了,需要用鼠标点击事件和重绘事件相联系才可以实现,我直接上代码,打字有点累
void MainWindow::mousePressEvent(QMouseEvent *event) //鼠标点击事件
{
if(event->button()==Qt::LeftButton)
{
if(_drawState==0) //判断状态为初始状态(没有槽函数发生)
{
return; //返回
}
else if(_drawState==1) //直线
{
if(_startPoint.isNull())
{
_startPoint=event->pos();
}
else
{
_endPoint=event->pos();
_drawState=0; //操作完毕,恢复初始化状态
_drawType=1;
qDebug()<<"_startPoint:"<<_startPoint;
qDebug()<<"_endPoint:"<<_endPoint;
update(); //进行重绘事件(别忘了在重绘之后对start和end初始化)
}
}
else if(_drawState==2) //矩形
{
if(_startPoint.isNull())
{
_startPoint=event->pos();
}
else
{
_endPoint=event->pos();
_drawState=0; //操作完毕,恢复初始化状态
_drawType=2;
qDebug()<<"_startPoint:"<<_startPoint;
qDebug()<<"_endPoint:"<<_endPoint;
off_x=_endPoint.x()-_startPoint.x();
off_y=_endPoint.y()-_startPoint.y();
update(); //进行重绘事件并且对start和end进行初始化
}
}
else if(_drawState==3) //圆形
{
if(_startPoint.isNull())
{
_startPoint=event->pos();
}
else
{
_endPoint=event->pos();
_drawState=0; //操作完毕,恢复初始化状态
_drawType=3;
qDebug()<<"_startPoint:"<<_startPoint;
qDebug()<<"_endPoint:"<<_endPoint;
off_x=_endPoint.x()-_startPoint.x();
off_y=_endPoint.y()-_startPoint.y();
d=sqrt(off_x*off_x+off_y*off_y);
update(); //进行重绘事件并且初始化start和end
}
}
else if(_drawState==4) //三角形
{
if(_point1.isNull())
{
_point1=event->pos();
}
else if(_point2.isNull())
{
_point2=event->pos();
}
else if(_point3.isNull())
{
_point3=event->pos();
_drawState=0; //操作完毕,初始化状态
_drawType=4;
qDebug()<<"_point1:"<<_point1;
qDebug()<<"_point2:"<<_point2;
qDebug()<<"_point3:"<<_point3;
update(); //进行重绘事件并且初始化point三个点
}
}
}
void MainWindow::paintEvent(QPaintEvent *event) //重绘事件
{
Q_UNUSED(event);
QPainter p(this);
QPen pen(QColor(255,0,0));
// QBrush brush(QColor(0,255,0,125));
p.setPen(pen);
// p.setBrush(brush);
p.setRenderHint(QPainter::Antialiasing);
if(_drawType==1)
{
//直线
p.drawLine(_startPoint,_endPoint);
//初始化并且鼠标恢复
_startPoint=QPoint(0,0);
_endPoint=QPoint(0,0);
setCursor(Qt::ArrowCursor);
}
else if(_drawType==2)
{
//矩形
p.drawRect(_startPoint.x(),_startPoint.y(),off_x,off_y);
//初始化
_startPoint=QPoint(0,0);
_endPoint=QPoint(0,0);
off_x=0;
off_y=0;
setCursor(Qt::ArrowCursor);
}
else if(_drawType==3)
{
//圆形
p.drawEllipse(QPointF(_startPoint.x()+off_x/2,
_startPoint.y()+off_y/2),
d/2,d/2);
//初始化
_startPoint=QPoint(0,0);
_endPoint=QPoint(0,0);
off_x=0;
off_y=0;
d=0;
setCursor(Qt::ArrowCursor);
}
else if(_drawType==4)
{
//三角形
QPointF points[3]=
{
QPointF(_point1.x(),_point1.y()),
QPointF(_point2.x(),_point2.y()),
QPointF(_point3.x(),_point3.y()),
};
p.drawPolygon(points,3);
//三角形---连接三条线 ---第二种方法
// p.drawLine(_point1,_point2);
// p.drawLine(_point1,_point3);
// p.drawLine(_point2,_point3);
//初始化
_point1=QPointF(0.0,0.0);
_point2=QPointF(0.0,0.0);
_point3=QPointF(0.0,0.0);
setCursor(Qt::ArrowCursor);
}
}
绘制的功能完成了,还剩下右键取消绘制功能。相信每个人一想到取消绘制功能就会想到 .clear()函数吧,很抱歉这里没法用,这样我们要怎么办呢?很简单它他一个值,你只要看不见就行了,在我们窗口的外面赋值就行了
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
...
}
else if(event->button()==Qt::RightButton)
{
_drawState=0;
_startPoint=QPoint(-1,-1); //直线矩形圆形的初始点和结束点
_endPoint=QPoint(-1,-1);
_point1=QPointF(-1.0,-1.0); //三角形的三个点
_point2=QPointF(-1.0,-1.0);
_point3=QPointF(-1.0,-1.0);
update();
}
}
在这里我们把点直接去赋值到我们看到的窗口外面就好了。
这里很多东西我只是复制的核心代码,好多东西都需要我们去声明和定义!!!