Qt实训项目----(1)

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)。
这里多添加了两个操作工具是因为我后面要用到。~

这就是ui界面

点击后会转变为“+”图标。—知道要在点击后改变,证明只在这一段生命周期有用,所以我们只需要在槽函数设置为开始转变,功能完成之后就初始化就好了。

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();
    }
}

在这里我们把点直接去赋值到我们看到的窗口外面就好了。

这里很多东西我只是复制的核心代码,好多东西都需要我们去声明和定义!!!

好了就这我们就完成了很简单的一个Qt的小项目,后面再慢慢更新!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值